如何使C代码符合MISRA C:2012标准?

时间:2019-01-08 02:21:57

标签: c embedded misra

我正在使用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])

1 个答案:

答案 0 :(得分:4)

一般说明:

  • 在担心是否符合MISRA-C之前,请先获取要在C编译器上编译的代码。
  • 然后确保您拥有MISRA-C:2012文档,或者您根本无法使用MISRA。
  • 摆脱“ Yoda条件”之类的废话。
  • 摆脱自定义typedef并使用stdint.h。如果您使用的是C90,则使用typedef使用的名称来命名stdint.h
  

1]无符号整数文字,不带“ U”后缀[MISRA 2012 Rule 7.2,必填] S_LCB_100,

非常自我解释。将Uu添加到应无符号的整数常量。有关详细信息,请阅读规则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)。