Misra违规12.6

use*_*192 5 c boolean typedef misra safety-critical

如何摆脱以下声明中的MISRA违规行为

typedef unsigned char boolean;

boolean A, B;

A = !B;
Run Code Online (Sandbox Code Playgroud)

逻辑的操作数!operator不是'有效布尔'表达式.MISRA-C:2004规则12.6; 参考 - ISO:C90-6.3.3.3一元算术运算符

Lun*_*din 5

如果您阅读规则 12.6,它会在附录中说“检查布尔表达式”。在那里我们可以阅读

“可以通过使用工具实现特定的类型强制机制来引入强制布尔值。布尔类型可以与特定的 typedef 相关联,然后将用于任何布尔对象。这可以带来许多好处,特别是如果检查工具可以支持它,特别是它可以帮助避免逻辑运算和整数运算之间的混淆。”

MISRA-C:2004 假定为 C90,而在 C90 中没有 bool 类型,您必须自己 typedef,就像您所做的那样。由于您的意图是拥有一个有效的布尔类型,因此代码很好。事实上,您的代码遵循 MISRA 建议而不是强制性建议。

问题在于您的工具:它要么不支持根据 MISRA 建议允许特定的布尔类型,要么配置错误。


小智 1

这个怎么样:

A = (B == 0 ? 1 : 0);
Run Code Online (Sandbox Code Playgroud)

  • MISRA 的目的始终是让您真正思考在表达式中使用的类型。MISRA 的目的绝不是让您编写混淆的代码来满足损坏的静态分析工具。 (3认同)