☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

不应存在得不到执行机会的代码

8.23 ID_unreachableCode
目录 › next › previous

得不到执行机会的代码是没有意义的,往往意味着逻辑错误。

这种代码的主要成因如下,括号内为特化规则:

  • 所在函数无法被调用(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
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.