CERT C: Rec. MSC17-C

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

Описание

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

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

Реализация Polyspace

Эта проверка проверяет Отсутствующий пропуск в случае переключателя.

Примеры

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

Проблема

Отсутствующий пропуск в корпусе переключателя ищет случаи переключения, которые не заканчиваются на break оператор.

Если последняя запись в блоке case является кодом комментарием, для образца:

switch (wt)
    {
      case WE_W:
        do_something_for_WE_W();
        do_something_else_for_WE_W();
        /* fall through to WE_X*/
      case WE_X:
        ...
    }
Polyspace принимает, что недостающий пропуск преднамеренен и не поднимает дефект.

Риск

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

Зафиксировать

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

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

Пример - Switch Without Break операторы
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.

Коррекция - Добавить комментарий или break

Чтобы исправить этот пример, либо добавьте комментарий к маркировке и документируйте допустимое падение, либо добавьте оператор break, чтобы избежать падения. В этом примере, случай WE_W предполагается, что он провалится, поэтому добавляется комментарий, чтобы явным образом указать это действие. Во втором случае добавляется оператор break, чтобы избежать падения в 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 Университет Карнеги Меллон, Веб-сайт SEI CERT-C + + © 2017 Университет Карнеги Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

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

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