Misra违规12.6

时间:2014-02-13 17:16:09

标签: c boolean typedef misra safety-critical

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

typedef unsigned char boolean;

boolean A, B;

A = !B;
  

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

5 个答案:

答案 0 :(得分:4)

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

  

“可以通过使用工具实现特定类型强制机制来引入布尔执行值。布尔类型可以与特定的typedef关联,并且   然后用于任何布尔对象。这可能会带来很多   有益的,特别是如果检查工具可以支持它,并在   特别是它可以帮助避免逻辑操作之间的混淆   和整数运算。“

MISRA-C:2004假设是C90,而在C90中没有bool类型,你必须自己输入,就像你做的那样。因为你的意图是有一个有效布尔的类型,所以代码就好了。实际上,您的代码遵循MISRA建议而非强制性建议。

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

答案 1 :(得分:2)

简单...不要对不是布尔值的事物使用!。仅仅因为你的typedef被命名为boolean并不意味着它;它仍然是unsigned char

你可以写:

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

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

A = (b == 0) ? 1 : 0;

答案 2 :(得分:1)

这个怎么样:

A = (B == 0 ? 1 : 0);

答案 3 :(得分:0)

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

进行比较来解释布尔义中的操作数
A = (B==0);

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

答案 4 :(得分:0)

您是否尝试过成语!!来转换布尔值:

中的值
bool bool_val = !!int_val;

然后,下面提到的代码可能会起作用:

A = !(!!B) // B is "cast" within the parenthesis then we apply the "NOT"