exponenta event banner

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

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

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

Группа: Rec. 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 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

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

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