MISRA 13.5 关于非编译示例的问题

MISRA 13.5 question about non-compilant example

试图理解规则 13.5 的不合规示例。

MISRA-2012 规则 13.5 规定 "The right hand operand of a logical && or || operator shall not contain persistent side effects" 理由是“......副作用可能发生也可能不发生,这可能与程序员的预期相反。” 我理解并完全同意这一点。然而,他们最后的不合规代码示例是:

/* Non-compliant if fp points to a function with persistent side effects */ 

( fp != NULL ) && ( *fp ) ( 0 );

这个构造似乎非常安全,因为条件和调用函数的决定是直接绑定的,其目的是不取消引用 NULL 指针。我知道 if 语句会更清楚,但如果有人有进一步的见解,我会很感兴趣。

This construct seems perfectly safe in that the condition and the decision to call the function are directly tied, where the intent is to not dereference a NULL pointer. I understand an if statement would be clearer but would be interested if anyone has further insight.

MISRA 试图定义无需猜测程序员意图即可解释的规则。因此,是的,如果在指针为 NULL 的情况下有意避免函数调用,那么您提供的构造就很好,但是对该代码执行 MISRA 分析的机器不一定能识别这种可能性。该规则主要针对 &&|| 的两个操作数不直接相关的条件语句。拒绝您描述的案例是附带损害。

当然可以把你的case换成

if (fp != NULL) {
    (*fp)(0);
}

。就个人而言,我发现 if 语句比原始表达式语句更清晰。当诸如原始表达式之类的表达式出现在 ifwhilefor 语句的条件中时,这不是一个明确的调用,但所有这些都可以重组以符合米斯拉也是。

规则 13.5 是 必需的 规则,旨在防止用户可能认为右侧已执行但用于排序电路评估的情况。

在引用示例的情况下,(可能)没问题 - 事实上,这是一个很常见的习语。

有两种选择...

  1. 按照@John Bollinger 的建议重构代码
  2. 偏离规则 - 这要求您证明为什么可以安全地违反规则,在引用的案例中,这应该是直截了当的

查看个人资料了解从属关系