exponenta event banner

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

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

Описание

Определение правила

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

Объяснение

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

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

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

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

Внедрение Polyspace

Флаги средства проверки for закольцовывается, где первый маркер, следующий за for оператор не является левой фигурной скобкой, например:

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

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

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

  • За ключевым словом else следует либо составной оператор, либо другой оператор if.

  • За конструкцией if (выражение) следует составное выражение.

  • Выражение, образующее тело выражения while, должно быть составным выражением.

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

  • Заявление, образующее тело для заявления, является составным заявлением.

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

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

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

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 заявление.

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

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

Группа: Поток управления
Категория: Обязательно
Категория СМЖЛ: требуется
Представлен в R2014b