首页 > 解决方案 > MISRA 13.5 关于非编译示例的问题

问题描述

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

MISRA-2012 规则 13.5 规定“逻辑 && 或 || 运算符的右手操作数不得包含持久的副作用”,其基本原理是“......可能会或可能不会发生可能与程序员期望相反的副作用。 " 我理解并完全同意这一点。然而,他们最后的不合规代码示例是:

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

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

这种结构看起来非常安全,因为调用函数的条件和决定是直接相关的,其目的是不取消引用 NULL 指针。我理解 if 语句会更清晰,但如果有人有进一步的见解,我会感兴趣。

标签: cmisra

解决方案


这种结构看起来非常安全,因为调用函数的条件和决定是直接相关的,其目的是不取消引用 NULL 指针。我理解 if 语句会更清晰,但如果有人有进一步的见解,我会感兴趣。

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

当然,您可以将您的案例替换为

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

. 就个人而言,我发现该if语句比原始表达式语句更清晰。当诸如原始表达式之类的表达式出现在 , 或 语句的条件下时,这并不是一个明确的调用ifwhile但是for所有这些都可以重新构造以符合 MISRA。


推荐阅读