以下几行生成 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.
Run Code Online (Sandbox Code Playgroud)
违规表示操作数是必要的有符号类型,但应该是布尔类型。
对于第一次违规,如果我将它们强制转换为 _Bool 类型,它会不会导致溢出,因为我记得 bool 数据类型的大小是 1 个字节。
对于第二次违规,请尝试以下操作:
(u16_a == 0)? 1 :2 // does this work
Run Code Online (Sandbox Code Playgroud)
我在处理 MISRA 违规方面还很陌生,并且对大多数违规行为感到困惑。提前致谢。
基本上,MISRA-C 希望我们将逻辑/关系运算符视为它们返回 bool 类型(如在 C++ 中),并且通常“假装”C 具有与整数分开的独特 bool 类型。当您使用静态分析工具时,这会提高类型安全性。
这意味着您必须明确检查零:
if ( (u16_a!=0u) && (u8_b!=0u) )
Run Code Online (Sandbox Code Playgroud)
和
(u16_a!=0) ? 2u : 1u
Run Code Online (Sandbox Code Playgroud)
或者最好是更具可读性的东西:
bool b_a = u16_a!=0u;
bool b_b = u8_b!=0u;
if(b_a && b_b) // MISRA compliant, operands are essentially boolean types
Run Code Online (Sandbox Code Playgroud)