Misra-C 2012规则10.1布尔操作数,用于表达式为布尔类型的情况

时间:2017-05-23 10:00:52

标签: c misra

以下行会产生错误违规行为。

unsigned int u16_a;
unsigned char u8_b;  
if (u16_a && u8_b) // Generates Misra-C 10.1 violation. 
(u16_a) ? 2 : 1 //Generates Misra-C 10.1 violation.

违规说操作数是必需的签名类型,但应该是布尔类型。

对于第一次违规,如果我输入它们为_Bool类型,它不会导致溢出,因为我记得bool数据类型的大小是1个字节。

对于第二次违规尝试了这个:

(u16_a == 0)? 1 :2 // does this work

我在处理MISRA违规行为方面相当新,并且与大多数违规行为相混淆。 提前致谢。

3 个答案:

答案 0 :(得分:3)

基本上,MISRA-C希望我们将逻辑/关系运算符视为返回bool类型(如在C ++中),并且通常“假装”C具有与整数分离的独特bool类型。当您使用静态分析工具时,这可以提高类型安全性。

这意味着您必须明确检查零:

if ( (u16_a!=0u) && (u8_b!=0u) )

(u16_a!=0) ? 2u : 1u

或者最好是更具可读性的东西:

bool b_a = u16_a!=0u;
bool b_b = u8_b!=0u;

if(b_a && b_b) // MISRA compliant, operands are essentially boolean types

答案 1 :(得分:2)

使用 if ( (u16_a !=0u) && (u8_b != 0u) ) 代替 if (u16_a && u8_b) 对于第一个例子。

对于后者: (u16_a == 0)? 1 :2似乎对我没问题。

最重要的是,这个MISRA要求的重点是:“在与值进行比较时明确指定,而不是依赖于默认值”。

答案 2 :(得分:0)

C标准说:

  

6.3.1.2布尔类型

     

1当任何标量值转换为_Bool时,如果值比较等于0,则结果为0;否则,结果是1。

所以投射到_Bool是正确的。 (x != 0)可能比((_Bool)x)更具可读性。