关于 AUTOSAR 布尔值的 MISRA 10.3 问题

Oli*_*Oli 7 c misra autosar

在我公司的项目中,AUTOSAR 平台定义了这样的布尔值

typedef unsigned char boolean;
Run Code Online (Sandbox Code Playgroud)

#ifndef TRUE 
#define TRUE 1 
#endif 
#ifndef FALSE 
#define FALSE 0 
#endif
Run Code Online (Sandbox Code Playgroud)

这是不可修改的。然后我们在以下两个分配中得到分配给更窄或不同的基本类型 [MISRA 2012 Rule 10.3, required]的 MISRA 10.3 错误表达式(当然替换了真实代码!)

boolean mybool = (boolean)FALSE;
if(some_condition)
{
   mybool = (boolean)TRUE;
}
Run Code Online (Sandbox Code Playgroud)

我们已经尝试了其他转换,有(uint8)FALSE(unsigned char)FALSE什至没有转换,mybool = TRUE;但没有解决问题。我们很乐意避免为偏差辩护。

有没有人知道会发生什么以及如何治愈它?


@Fredrik 感谢您的第一个回答。我把它放在一个虚拟标题中,将它包含在“罪魁祸首”中.c并在这个单元上运行 PC-Lint/MISRA

#define testTRUE 1U
boolean x = testTRUE;
boolean y = (uint8)testTRUE;
boolean z = (boolean)testTRUE;

#define testTRUE_2 1
boolean x_2 = testTRUE_2;
boolean y_2 = (uint8)testTRUE_2;
boolean z_2 = (boolean)testTRUE_2;

unsigned char x_3 = (boolean)1;
unsigned char y_3 = (boolean)testTRUE;
unsigned char z_3 = (boolean)testTRUE_2;
Run Code Online (Sandbox Code Playgroud)

并在前 6 个作业中遇到同样的问题。至于最后 3 个赋值,错误没有出现,但可能被替换为这个错误:在 typedef 之外使用修饰符或类型“无符号”[MISRA 2012 指令 4.6,建议]

Lun*_*din 2

MISRA-C 和布尔值的问题在于,MISRA 鼓励我们“假装”语言中存在布尔类型,并将关系运算符和相等运算符的结果视为“本质上布尔值”。

也就是说,像 C++ 一样对待布尔类型。C 确实在 C99 中引入了布尔值,但所提到的运算符的结果仍然是int,而不是bool像 C++ 中那样。但 MISRA 希望我们“假装”它们是布尔值,以使代码正确。此外,MISRA-C 仍然涵盖没有标准booltrueC90 false

因此,为了让布尔值像 MISRA 所希望的那样工作,您需要一种方法来告诉您的静态分析器boolean, ,TRUEFALSE是您的布尔类型。否则,该工具会将它们视为int,然后您会收到各种隐式转换警告。我不知道如何在 PC-Lint 上执行此操作,但该错误是工具配置问题。

至于发布的代码,boolean mybool = FALSE;考虑到这是“本质上布尔”类型,因此符合 MISRA 要求。无需施展。如果您没有配置该工具,则任何转换都无法拯救您。一般来说,除非您知道为什么要这样做,否则永远不要在 C 中进行强制转换。