MISRA C:2012 Rule 15.6

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

Описание

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

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

Объяснение

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

  • Операторы цикла, такие как 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