exponenta event banner

CERT C: Rec. MSC17-C

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

Описание

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

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

Внедрение Polyspace

Эта проверка проверяет наличие отсутствующего разрыва корпуса коммутатора.

Примеры

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

Проблема

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

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

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 предполагает, что недостающий разрыв является намеренным и не вызывает дефекта.

Риск

Варианты переключения без инструкций 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 case execute, поскольку программа проходит через два варианта без перерыва. Дефект не возникает на default дело или последнее дело, поскольку для него не требуется оператор 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 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

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

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