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, for и do..while операторы.

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

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

  • За другим ключевым словом следует либо составной оператор, либо другой оператор 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