switch 语句的每个非空分枝都应该用无条件的 break 或 return 语句终止
9.5.13 ID_switch_breakOmitted
在 switch 语句的分枝中,break 或 return 语句的缺失是导致错误的常见原因。
示例:
switch (a)
{
case 0:
b = 1;
break; // Compliant
case 1:
b = 2; // Non-compliant, missing ‘break’
default:
b = 3;
break; // Compliant
}
相连的 case 标签不受本规则约束,但最好配有注释:
switch (c)
{
case 0: // Compliant
case 1:
....
break;
}
少数情况下,如果确实不能有 break 或 return 语句,应添加注释说明情况,或在 C++ 代码中用 [[fallthrough]] 注明:
switch (v)
{
case 1:
do_something();
[[fallthrough]]; // Compliant, since C++17
default:
do_something_default();
break;
}
依据
ISO/IEC 9899:1999 6.8.4.2(7)
ISO/IEC 9899:2011 6.8.4.2(7)
ISO/IEC 14882:2003 6.4.2(6)
ISO/IEC 14882:2011 6.4.2(6)
ISO/IEC 14882:2017 10.6.5(1 2 3)
参考
CWE-484
C++ Core Guidelines ES.78
MISRA C 2004 15.2
MISRA C 2012 16.3
MISRA C++ 2008 6-4-5