我正在使用PC-Lint将MISRA C:2012标准验证为我的MCU代码。 我遇到了以下错误。在这里发布了示例代码,其中条件语句出现了错误。
1]无符号整数文字,不带“ U”后缀[MISRA 2012 Rule 7.2,必填] S_LCB_100,
2]逻辑运算符'&&'右侧的副作用[MISRA 2012规则13.5,必填] while(((0x00000000!= List [Loop])&&(0!= Counter))
3]:带符号的值和无符号的值不能一起用作!=的操作数[MISRA 2012 Rule 10.4,必需] while(((0x00000000!= List [Loop])&&(0!= Counter))
4]:带符号的值和无符号的值不能同时用作!= [MISRA 2012 Rule 10.4,required]的操作数while(((0x00000000!= List [Loop])&&(0!= Counter))< / p>
5]如果(List [Loop] == 0x00000000)
,则不能将无符号值和带符号值一起用作== [MISRA 2012 Rule 10.4,required]的操作数。如何使它符合MISRA C:2012?
fig, axs = plt.subplots(2,2)
sns.plotfunc(..., ax = axs[0])
答案 0 :(得分:4)
一般说明:
stdint.h
。如果您使用的是C90,则使用typedef
使用的名称来命名stdint.h
。1]无符号整数文字,不带“ U”后缀[MISRA 2012 Rule 7.2,必填] S_LCB_100,
非常自我解释。将U
或u
添加到应无符号的整数常量。有关详细信息,请阅读规则7.2。
2]逻辑运算符'&&'的副作用[MISRA 2012规则13.5,必需] while(((0x00000000!= List [Loop])&&(0!= Counter))
Counter
具有挥发性限制,访问它是一种副作用。因此,它一般不应该存在于复杂的表达式中,尤其是不应该位于布尔&&表达式的右侧-这是相当可疑的代码。在这种情况下,您可以这样简单地重写代码:
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)。