CERT C: Rec. EXP19-C

Используйте скобки для тела оператора if, for или while

Описание

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

Используйте скобки для тела оператора if, for или while.[1]

Реализация Polyspace

Эта проверка проверяет итерацию или выделение тела оператора не заключенного в скобки.

Примеры

расширить все

Проблема

Проблема возникает, когда вы не заключаете тело оператора итерации или оператора выделения в скобки.

Риск

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

  • Операторы итерации, такие как while, do ... while или for.

  • Операторы выбора, такие как if ... else или 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>

bool flag_1, flag_2;

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 оператор в скобках.

#include <stdbool.h>

bool flag_1, flag_2;

void f1(void) {
    if(flag_1) {                          /* Compliant */
        if(flag_2) {                        /* Compliant */
            action_1();
        }
    }
    else {                                /* Compliant */
        action_2();
    }
}

Пример - Ложная точка с запятой после оператора итерации
#include <stdbool.h>

bool flag_1;

void f1(void) {
    while(flag_1);                        /* Non-compliant */
    {
        flag_1 = action_1();
    }
}

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

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

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

Группа: Рек. 03. Выражения (EXP)
Введенный в R2019a

[1] Это программное обеспечение было создано MathWorks, включающее фрагменты: «Сайт SEI CERT-C», © 2017 Университет Карнеги Меллон, Веб-сайт SEI CERT-C + + © 2017 Университет Карнеги Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОН И/ИЛИ ЕГО ИНЖЕНЕРНОГО ИНСТИТУТА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ НА БАЗИСЕ «КАК ЕСТЬ». УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБОГО ВОПРОСА, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЮ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ КОММЕРЧЕСКОЙ ВЫГОДЫ, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Это программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллон или его Институтом программной инженерии.