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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ВЫРАЗИЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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