我正在使用 PC-Lint 验证 MISRA C:2012 标准到我的 MCU 代码。 我遇到了以下错误。这里我发布了一个示例代码,其中我在条件语句中遇到了错误。
1] 不带“U”后缀的无符号整数文字 [MISRA 2012 规则 7.2,必需] S_LCB_100,
2] 逻辑运算符“&&”右侧的副作用 [MISRA 2012 规则 13.5,必需] while(( 0x00000000 != 列表[循环] ) && ( 0 != 计数器 ))
3] :有符号值和无符号值不能一起用作 != 的操作数 [MISRA 2012 规则 10.4,必需] while(( 0x00000000 != 列表[循环] ) && ( 0 != 计数器 ))
4] :有符号值和无符号值不能一起用作 != 的操作数 [MISRA 2012 规则 10.4,必需] while(( 0x00000000 != List[Loop] ) && ( 0 != Counter ))
5] 无符号值和有符号值不能一起用作 == [MISRA 2012 规则 10.4,必需] if ( List[Loop] == 0x00000000 ) 的操作数
如何才能使其符合 MISRA C:2012 要求?
typedef unsigned char UINT8;
typedef unsigned char BYTE;
typedef unsigned long int UINT32;
#define S_LCB_100 0xF0BB12DE;
#define MULTI 0x1A;
volatile static BYTE Counter = 0;
static UINT8 Loop = 0;
static UINT32 List[]=
{
S_LCB_100,
0x00000000,
};
while(( 0x00000000 != List[Loop] ) && ( 0 != Counter ))
{
.......some code
}
if ( List[Loop] == 0x00000000 )
{
.....some code
}
一般备注:
stdint.h
。如果您使用的是 C90,则 typedef
与 stdint.h
使用的名称。1] 不带“U”后缀的无符号整数文字 [MISRA 2012 规则 7.2,必需] S_LCB_100,
非常不言自明。将
U
或 u
添加到应无符号的整数常量。详细阅读规则 7.2。
2] 逻辑运算符“&&”右侧的副作用 [MISRA 2012 规则 13.5,必需] while(( 0x00000000 != List[Loop] ) && ( 0 != Counter ))
Counter
是 volatile 限定的,访问它是一个副作用。因此,它通常不应该存在于复杂表达式中,特别是不应该存在于布尔 && 表达式的右侧 - 这是非常有问题的代码。在这种情况下,您可以简单地将代码重写为:
uint32_t count = (uint32_t)Counter;
while((count != 0u) && (List[Loop] != 0u))
{
...
count = (uint32_t)Counter; // read volatile variable in an expression of its own
}
3] 有符号值和无符号值不能一起用作 != 的操作数 [MISRA 2012 规则 10.4,必需] while(( 0x00000000 != List[Loop] ) && ( 0 != Counter ))
这是因为
Counter
被声明为 BYTE
。放弃所有这些自制的垃圾类型,并将其声明为 uint8_t
。然后使用 while
形式,如上所示。使用 u
后缀。这应该可以修复 2) 到 5)。
您可以使用 codeant.ai 等工具自动检查和修复代码是否符合 MISRA C 2012。
我写了一篇关于 MISRA C 2012 合规性要求的博客以及示例:
https://www.codeant.ai/blogs/misra-c-2012-rules-examples-pdf
PS:我为 codeant.ai 工作