exponenta event banner

MISRA C:2012 Правило 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