MISRA C:2012 Rule 15.6

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

Описание

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

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

Объяснение

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

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

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

Это средство проверки осуществляет практику добавления фигурных скобок после выбора или оператора цикла даже для одной строки в теле. Позже, когда больше линий добавлено, разработчик, добавляющий их, не должен отмечать отсутствие фигурных скобок и включать их.

Реализация Polyspace

Средство проверки отмечает for циклы, где первая лексема после for оператор не является левой фигурной скобкой, например:

for (i=init_val; i > 0; i--)
   if (arr[i] < 0)
      arr[i] = 0;
Подобные проверки выполнены для if, else if, else, switchдля и do..while операторы.

Вторая линия сообщения на панели Result Details указывает, какой оператор нарушает правило. Например, в предыдущем примере, существует два нарушения. Вторая линия сообщения указывает на for цикл для одного нарушения и if условие для другого.

Дополнительное сообщение в отчете

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

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

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

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

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

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

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

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

Примеры

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

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

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

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

#include<stdbool.h>
void f1(bool flag_1, bool flag_2) {
    if(flag_1)                            /* Non-compliant */
        if(flag_2)                        /* Non-compliant */
            action_1();
    else                                  /* Non-compliant */
            action_2();
}

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

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

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

#include<stdbool.h>
void f1(bool flag_1, bool flag_2) {
    if(flag_1) {                          /* Compliant */
        if(flag_2) {                        /* Compliant */
            action_1();
        }
    }
    else {                                /* Compliant */
        action_2();
    }
}

#include<stdbool.h>
void f1(bool flag_1) {
    while(flag_1);                        /* Non-compliant */
    {
        flag_1 = action_1();
    }
}

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

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

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

Группа: Поток управления
Категория: необходимый
Категория AGC: необходимый
Введенный в R2014b