在我公司的项目中,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,建议]
MISRA-C 和布尔值的问题在于,MISRA 鼓励我们“假装”语言中存在布尔类型,并将关系运算符和相等运算符的结果视为“本质上布尔值”。
也就是说,像 C++ 一样对待布尔类型。C 确实在 C99 中引入了布尔值,但所提到的运算符的结果仍然是int,而不是bool像 C++ 中那样。但 MISRA 希望我们“假装”它们是布尔值,以使代码正确。此外,MISRA-C 仍然涵盖没有标准bool的trueC90 false。
因此,为了让布尔值像 MISRA 所希望的那样工作,您需要一种方法来告诉您的静态分析器boolean, ,TRUE和FALSE是您的布尔类型。否则,该工具会将它们视为int,然后您会收到各种隐式转换警告。我不知道如何在 PC-Lint 上执行此操作,但该错误是工具配置问题。
至于发布的代码,boolean mybool = FALSE;考虑到这是“本质上布尔”类型,因此符合 MISRA 要求。无需施展。如果您没有配置该工具,则任何转换都无法拯救您。一般来说,除非您知道为什么要这样做,否则永远不要在 C 中进行强制转换。
| 归档时间: |
|
| 查看次数: |
430 次 |
| 最近记录: |