CERT C: Rec. EXP19-C

Используйте фигурные скобки в теле если, поскольку, или в то время как оператор

Описание

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

Используйте фигурные скобки в теле если, поскольку, или в то время как оператор. [1]

Примеры

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

Описание

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

Риск

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

  • Операторы цикла, такие как 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 блок заключен в фигурные скобки и не нарушает правило.

Пример - вложенные операторы выбора

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 оператор в фигурных скобках.

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

Пример - побочная точка с запятой после оператора цикла

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 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

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

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