我正在使用PC Lint验证我的MCU代码的MISRA C:2012标准。
我发现了以下错误。这里我发布了一个示例代码,在这里我得到了条件语句的错误。
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,必需],而((0x00000000!=列表[循环]&&(0!=计数器)
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
}

最佳答案

一般说明:
在担心MISRA-C遵从性之前,先让代码在C编译器上编译。
然后确保你有MISRA-C:2012文件可用,否则你就不能使用MISRA。
摆脱像“尤达条件”这样的废话。
去掉自定义typedef并使用stdint.h。如果您在C90上,则使用typedef使用的名称。
1]不带'U'后缀的无符号整数文本[MISRA 2012规则7.2,必需]S_LCB_100,
很自我解释。将stdint.hU添加到应无符号的整数常量。详情请参阅规则7.2。
2]逻辑运算符右侧的副作用,“&&&”[MISRA 2012规则13.5,必需],((0x00000000!=列表[循环]&&(0!=计数器)
u是voltatile限定的,访问它是一个副作用。因此,它不应该存在于复杂的表达式中,特别是不在布尔和表达式的右侧——这是相当可疑的代码。在这种情况下,您可以简单地重写代码,如下所示:

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,必需],而((0x00000000!=列表[循环]&&(0!=计数器)
这是因为Counter被声明为Counter。放下所有这些自制的垃圾类型,并声明为BYTE。然后使用如上所示的uint8_t表单。使用while后缀。这应该是2)到5)。

关于c - 如何使C代码符合MISRA C:2012标准?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54084453/

10-11 21:21