Missing break of switch case

Никакие комментарии в конце случая переключателя без оператора завершения

Описание

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

Риск

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

Фиксация

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

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

Примеры

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

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();
    }
}

Информация о результате

Группа: хорошая практика
Язык: C | C++
Значение по умолчанию: Off
Синтаксис командной строки: MISSING_SWITCH_BREAK
Удар: низко
ID CWE: 484
Введенный в R2017b