不应存在得不到执行机会的代码
8.23 ID_unreachableCode
得不到执行机会的代码是没有意义的,往往意味着逻辑错误。
这种代码的主要成因如下,括号内为特化规则:
- 所在函数无法被调用(ID_staticNotUsed、ID_privateNotUsed)
- 之前的所有分枝都提前结束了程序的执行
- 之前的必经分枝中存在不会结束执行的代码
- 所在分枝的条件恒为假(ID_constLogicExpression、ID_invalidCondition、ID_switch_caseOutOfRange)
- 所在分枝被其他分枝遮盖(ID_if_identicalCondition、ID_if_hiddenCondition、ID_try_disorderedHandlers、ID_try_disorderedEllipsis)
- 流程被不受条件控制的跳转语句跨过(ID_uncondJump)
示例:
int fun() {
if (cond) {
return 0;
} else {
return 1;
}
statements // Non-compliant, unreachable
}
例中 statements 之前的所有分枝都会结束函数的执行,所以 statements 不会被执行。
另外,在正式代码中不应存在如下形式的代码:
if (false) { .... } // Non-compliant
while (false) { .... } // Non-compliant
for (;false;) { .... } // Non-compliant
也不应该在 return 语句之后存在其他语句,这种代码如果不是被人恶意篡改,就是出于某种目的将本已无效的代码遗留了下来,可参见 ID_constLogicExpression、ID_invalidCondition 的进一步讨论。
建议时刻保持代码的整洁,并将维护过程中的变动及时地保存在版本管理系统中,这样可以清晰地查看各版本之间的变动,而如果将无效代码与有效代码混在一起,势必造成维护的负担。
相关
ID_staticNotUsed
ID_privateNotUsed
ID_constLogicExpression
ID_invalidCondition
ID_switch_caseOutOfRange
ID_if_identicalCondition
ID_if_hiddenCondition
ID_try_disorderedEllipsis
ID_try_disorderedHandlers
ID_uncondJump
参考
CWE-561
MISRA C 2004 14.1
MISRA C 2012 2.1
MISRA C++ 2008 0-1-1
SEI CERT MSC12-C