5

如何在以下声明中摆脱 MISRA 违规

typedef unsigned char boolean;

boolean A, B;

A = !B;

逻辑运算!运算符不是“有效布尔”表达式。MISRA-C:2004 规则 12.6;参考 - ISO:C90-6.3.3.3 一元算术运算符

4

5 回答 5

5

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

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

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

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

于 2014-02-14T08:47:49.640 回答
2

简单...不要用于!非布尔值的东西。仅仅因为您的 typedef 被命名boolean并不意味着它是;它仍然是一个unsigned char.

你可以写:

if (b == 0) A = 1;
else A = 0;

我不认为 MISRA 允许三元运算符(可能是错误的;不是专家),但如果 允许,你可以写:

A = (b == 0) ? 1 : 0;
于 2014-02-13T17:22:05.490 回答
1

这个怎么样:

A = (B == 0 ? 1 : 0);
于 2014-02-13T17:21:39.767 回答
0

您是否尝试过!!将值转换为布尔值的习语:

bool bool_val = !!int_val;

那么下面牵强的代码可能会起作用:

A = !(!!B) // B is "cast" within the parenthesis then we apply the "NOT"
于 2014-02-14T09:00:46.273 回答
0

虽然 ISO:C90 标准规定操作数可以是任何标量类型,但 ! 运算符始终产生 0 或 1 的值;基础类型(在 MISRA-C:2004 术语中)被认为是有效的布尔值,但操作数不是。由于运算符通过将其 0 与 try 进行比较来解释其操作数的布尔意义:

A = (B==0);

这使得逻辑比较明确。此外,根据工具的不同,您可以为此 typedef 配置布尔类型强制机制。

于 2014-02-13T22:35:01.337 回答