Правило 15.6 MISRA C:2012

Тело оператора цикла или оператора выбора должно быть составным оператором

Описание

Управляйте определением

Тело оператора цикла или оператора выбора должно быть составным оператором.

Объяснение

Правило применяется:

  • Операторы цикла, такие как while, do ... while или for.

  • Операторы выбора, такие как if ... else или switch.

Если блок кода, сопоставленный с итерацией или оператором выбора, не содержится в фигурных скобках, можно сделать ошибки об ассоциации. Например:

  • Можно неправильно сопоставить строку кода с итерацией или оператором выбора из-за его добавления отступа.

  • Можно случайно поместить точку с запятой после оператора выбора или итерации. Из-за точки с запятой строка после оператора больше не сопоставляется с оператором даже при том, что вы предназначили в противном случае.

Обменивайтесь сообщениями в отчете

  • Еще ключевое слово должно сопровождаться или составным оператором или другим оператором if.

  • Если (выражение) создают, буду сопровождаться составным оператором.

  • Оператор, формирующий тело некоторое время оператора, должен быть составным оператором.

  • Оператор, формирующий орган по..., в то время как оператор должен быть составным оператором.

  • Оператор, формирующий тело для оператора, должен быть составным оператором.

  • Оператор, формирующий тело оператора switch, должен быть составным оператором.

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

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

int data_available = 1;
void f1(void) {
    while(data_available)                 /* Non-compliant */
        process_data();

    while(data_available) {               /* Compliant */
        process_data();
    }
}

В этом примере второй блок while заключен в фигурные скобки и не нарушает правило.

void f1(void) {
    if(flag_1)                            /* Non-compliant */
        if(flag_2)                        /* Non-compliant */
            action_1();
    else                                  /* Non-compliant */
            action_2();
}

В этом примере нарушено правило, потому что if или блоки else не заключены в фигурные скобки. Если не расположено с отступом как выше, легко сопоставить оператор else с внутренним if.

Исправление — блок операторов выбора места в фигурных скобках

Одно возможное исправление должно заключить каждый блок, сопоставленный с оператором if или else в фигурных скобках.

void f1(void) {
    if(flag_1) {                          /* Compliant */
        if(flag_2) {                        /* Compliant */
            action_1();
        }
    }
    else {                                /* Compliant */
        action_2();
    }
}

void f1(void) {
    while(flag_1);                        /* Non-compliant */
    {
        flag_1 = action_1();
    }
}

В этом примере нарушено правило даже при том, что оператор while сопровождается блоком в фигурных скобках. Точка с запятой после оператора while вызывает блок к отделенному от оператора while.

Правило помогает обнаружить такие побочные точки с запятой.

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

Группа: Поток управления
Категория: необходимый
Категория AGC: необходимый
Язык: C90, C99

Введенный в R2014b