CERT C: Rec. MSC17-C

Закончите каждый набор операторов, сопоставленных с меткой случая с оператором завершения

Описание

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

Закончите каждый набор операторов, сопоставленных с меткой случая с оператором завершения. [1]

Примеры

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

Описание

Недостающий пропуск случая переключателя ищет случаи переключателя, которые не заканчиваются в операторе break. Если случай не имеет комментария к коду после него, Polyspace принимает, что недостающий пропуск не является намеренным и повышает дефект.

Риск

Переключите случаи без падения операторов завершения до следующего случая переключателя. Если это проваливается, не предназначается, случай переключателя может непреднамеренно выполнить код и закончить переключатель неожиданными результатами.

Фиксация

Если вы не хотите пропуск для подсвеченного случая переключателя, добавьте комментарий в свой код к документу, почему этот случай падает до следующего случая. Этот комментарий удаляет дефект из ваших результатов и делает ваш код более удобным в сопровождении.

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

Пример - переключается без операторов завершения

enum WidgetEnum { WE_W, WE_X, WE_Y, WE_Z } widget_type;

extern void demo_do_something_for_WE_W(void);
extern void demo_do_something_for_WE_X(void);
extern void demo_report_error(void);

void bug_missingswitchbreak(enum WidgetEnum wt)
{
    /*
      In this non-compliant code example, the case where widget_type is WE_W lacks a
      break statement. Consequently, statements that should be executed only when
      widget_type is WE_X are executed even when widget_type is WE_W.
    */
    switch (wt)
    {
      case WE_W: 
        demo_do_something_for_WE_W();
      case WE_X: 
        demo_do_something_for_WE_X();
      default:
        /* Handle error condition */
        demo_report_error();
    }
}

В этом примере существует два случая без операторов break. Когда wt является WE_W, операторы для WE_W, WE_X, и случай default выполняется, потому что программа проваливается эти два случая без пропуска. Никакой дефект не повышен на случае default или последнем случае, потому что этому не нужен оператор завершения.

Исправление — добавляет комментарий или break

Чтобы зафиксировать этот пример, или добавьте, что комментарий, чтобы отметить и зарегистрировать приемлемое проваливается или добавляет, что оператор завершения, чтобы избежать проваливается. В этом примере случай WE_W, как предполагается, проваливается, таким образом, комментарий добавляется, чтобы явным образом утвердить это действие. Для второго случая оператор завершения добавляется, чтобы не падать до случая default.

enum WidgetEnum { WE_W, WE_X, WE_Y, WE_Z } widget_type;

extern void demo_do_something_for_WE_W(void);
extern void demo_do_something_for_WE_X(void);
extern void demo_report_error(void);

void corrected_missingswitchbreak(enum WidgetEnum wt)
{
    switch (wt)
    {
      case WE_W:
        demo_do_something_for_WE_W();
        /* fall through to WE_X*/
      case WE_X:
        demo_do_something_for_WE_X();
        break;  
      default:
        /* Handle error condition */
        demo_report_error();
    }
}

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

Группа: Rec. 48. Разное (MSC)

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

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