Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Данное диагностическое правило различается для C и C++. Для обоих языков каждая метка в 'switch' должна быть завершена оператором 'break', не расположенным внутри условия. А для C++ последним оператором также может быть 'throw'.
Намеренное завершение каждой метки гарантирует, что поток управления не "провалится" в метку, расположенную ниже, и позволяет избежать ошибок при добавлении новых меток.
Исключением из этого правила являются пустые метки, расположенные последовательно.
Пример кода, на который анализатор выдаст предупреждение:
void example_1(int cond, int a) { switch (cond) { case 1: case 2: break; case 3: // <= if (a == 42) { DoSmth(); } case 4: // <= DoSmth2(); default: // <= ; } }
Исправленный код:
void example_1(int cond, int a) { switch (cond) { case 1: case 2: break; case 3: if (a == 42) { DoSmth(); } break; case 4: DoSmth2(); break; default: /* No action required */ break; } }
Следует отметить, что метки не должны завершаться выражением 'return', так как это нарушает правило V2506.
Данная диагностика классифицируется как:
|