Missing break of switch case

Без комментариев в конце варианта switch без оператора break

Описание

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

Примеры

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

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

Чтобы исправить этот пример, добавьте комментарий после последнего оператора в блоке case и перед следующим блоком case, чтобы пометить и документировать приемлемое падение, или добавьте оператор 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();
    }
}

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

Группа: Хорошая практика
Язык: C | C++
По умолчанию: Off
Синтаксис командной строки: MISSING_SWITCH_BREAK
Влияние: Низкое
ИДЕНТИФИКАТОР CWE: 484
Введенный в R2016b