【问题标题】:Misra-C 2012 rule 10.1 boolean operand to be used in case where expression is of boolean typeMisra-C 2012 规则 10.1 布尔操作数,用于在表达式为布尔类型的情况下
【发布时间】:2017-05-23 10:00:52
【问题描述】:

以下行会产生 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 违规行为方面非常陌生,并且对大多数违规行为感到困惑。 提前致谢。

【问题讨论】:

  • u16_au8_a有哪些类型?
  • 对不起,将编辑问题。 u16_a 指 unsigned int_16 , u8_a 指 unsigned char
  • 你能把它们声明为_Bool吗?
  • 您不能将 转换为 _Bool,因为 _Bool 假定 true = 值 1。

标签: c misra


【解决方案1】:

基本上,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

【讨论】:

  • 这( (u16_a!=0u) && (u8_b!=0u) )是否不会导致 MISRA 10.4 违规。因为 u16_a 本质上是 unsigned int 16 位,而 0u 是 unsigned 8 位
  • @prime130392 != 的结果始终是 int 类型。因此&& 的两个操作数都是int。 (虽然根据 MISRA,本质上是布尔值)
【解决方案2】:

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

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

底线是该 MISRA 要求的全部要点是:“在与值进行比较时明确指定,而不是依赖默认值”。

【讨论】:

  • 谢谢。为了快速回复
【解决方案3】:

C 标准说:

6.3.1.2 布尔类型

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

所以转换为 _Bool 是正确的。 (x != 0) 可能比 ((_Bool)x) 更具可读性。

【讨论】:

    猜你喜欢
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多