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

标签 c misra

试图理解规则 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 语句比原始表达式语句更清晰。当诸如您的原始表达式之类的表达式出现在 ifwhilefor 语句的条件中时,这不是一个明确的调用,但是所有这些都可以重组以符合 MISRA。

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

相关文章:

c - pthread_kill 异步信号在 Linux 上安全吗?

c - gtkSourceView - 查询工具提示文本的使用

c++ - 运动不工作 ncurses 游戏

c++ - Linux 开发人员了解 C++?

c - 违反 MISRA 规则 10.4

c - 如何处理或不处理 gtk control+c?

c - line_c |= 064;/* 错误地设置了位 2,4 和 5 */.. Misra C 指南。这是怎么发生的?

c - 在 C 中正确丢弃 volatile 变量内容的替代方法是什么?

c - MISRA C 2012 规则 16.1 所有 switch 语句都应格式正确

java - 是否有与 MISRA C 等效的 Java?