试图理解规则 13.5 的不合规示例。
MISRA-2012 规则 13.5 指出“逻辑 && 或 || 运算符的右手操作数不得包含持久的副作用”,理由是“......副作用可能会或可能不会发生,这可能与程序员的期望。” 我理解并完全同意这一点。然而,他们最后的不合规代码示例是:
/* Non-compliant if fp points to a function with persistent side effects */
( fp != NULL ) && ( *fp ) ( 0 );
这个结构看起来非常安全,因为条件和调用函数的决定是直接绑定(bind)的,其目的是不取消引用 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
语句比原始表达式语句更清晰。当诸如您的原始表达式之类的表达式出现在 if
、while
或 for
语句的条件中时,这不是一个明确的调用,但是所有这些都可以重组以符合 MISRA。
关于c - MISRA 13.5 关于非编译示例的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54114895/