MISRA C:2012 Rule 15.3

Любая метка, на которую ссылается оператор goto, должна быть объявлена в том же блоке или в любом блоке, содержащем оператор goto

Описание

Определение правила

Любая метка, на которую ссылается оператор goto, должна быть объявлена в том же блоке или в любом блоке, содержащем оператор goto.

Объяснение

Неограниченное использование goto операторы делают программу неструктурированной и трудной для понимания. Ограничение использования goto операторы для перехода между блоками или во вложенные блоки уменьшают сложность визуального кода.

Поиск и устранение проблем

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

void f1(int a) {
    if(a <= 0) {
        goto L2;        /* Non-compliant - L2 in different block*/
    }
    
    goto L1;            /* Compliant - L1 in same block*/

    if(a == 0) {
        goto L1;        /* Compliant - L1 in outer block*/
    }

    goto L2;            /* Non-compliant - L2 in inner block*/

    L1: if(a > 0) {
            L2:;
    }
}

В этом примере goto операторы вызывают переходы к разным меткам. Правило нарушается, когда:

  • Метка возникает в блоке, отличном от блока, содержащего goto оператор.

    Блок, содержащий метку, не заключает и не заключается в текущий блок.

  • Метка происходит в блоке, заключенном в блок, содержащий goto оператор.

Правило не нарушается, когда:

  • Метка находится в том же блоке, что и блок, содержащий goto оператор..

  • Метка возникает в блоке, который окружает блок, содержащий goto оператор..

void f2 ( int x, int z ) {
    int y = 0;

    switch(x) {
    case 0:
        if(x == y) {
            goto L1;  /* Non-compliant - switch-clauses are treated as blocks */
        }
        break;
    case 1:
        y = x;
        L1: ++x;
        break;
    default:
        break;
    }

}

В этом примере метка для goto оператор появляется в блоке, который заключает в себя блок, содержащий goto оператор. Однако в целях этого правила программное обеспечение считает, что каждый case оператор начинает новый блок. Поэтому goto оператор нарушает правило.

Проверяйте информацию

Группа: Управляйте Потоком
Категория: Требуемая
Категория СМЖЛ: Консультационная
Введенный в R2014b