MISRA C:2012 Rule 15.6

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

Описание

Примечание

Используйте Bug Finder вместо Code Prover для проверки правил кодирования. Поддержка кодирования правил, регистрируясь в Code Prover будет удалена в будущем релизе. См. Вопросы совместимости.

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

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

Объяснение

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

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

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

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

Реализация Polyspace

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

for (i=init_val; i > 0; i--)
   if (arr[i] < 0)
      arr[i] = 0;
Подобные проверки выполнены для if, else if, elseSwitchдля и 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: необходимый

Вопросы совместимости

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

Не рекомендуемый запуск в R2021b

Введенный в R2014b