试图理解规则13.5的不符合示例。
MISRA-2012规则13.5规定“逻辑&&or | |运算符的右手操作数不应包含持续的边效应”,其基本原理是”。。。副作用可能发生,也可能不发生,这可能与程序员的预期相反。”
我理解并完全同意这一点。然而,他们不符合规范的最后一个例子是:

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

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

这个构造看起来非常安全,因为条件和调用函数的决定是直接绑定的,其目的是不取消对空指针的引用。我理解如果一个声明将更清楚,但如果有人有进一步的见解将感兴趣。

最佳答案

这个构造看起来非常安全,因为条件和调用函数的决定是直接绑定的,其目的是不取消对空指针的引用。我理解如果一个声明将更清楚,但如果有人有进一步的见解将感兴趣。
MISRA试图定义可以解释的规则,而不必猜测程序员的意图。所以是的,如果指针为空时有意避免函数调用,那么您提供的构造是可以的,但是对代码执行MISRA分析的机器不一定能识别这种可能性。该规则主要针对&&||的两个操作数不直接相关的条件语句。拒绝你所描述的案件是附带损害。
当然,你可以用

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

. 我个人认为if语句比原来的表达式语句更清楚。当像原来这样的表达式出现在ifwhilefor语句的条件下时,这并不是一个清晰的调用,但是所有这些都可以重新构造以符合MISRA。

关于c - MISRA 13.5有关不合规示例的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54114895/

10-12 06:21