如何使 C 代码符合 MISRA C:2012 合规性?

问题描述 投票:0回答:2

我正在使用 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
} 
c embedded misra
2个回答
4
投票

一般备注:

  • 在担心 MISRA-C 合规性之前,请先在 C 编译器上编译代码。
  • 然后确保您有 MISRA-C:2012 文档,否则您根本无法使用 MISRA。
  • 摆脱“尤达条件”之类的废话。
  • 摆脱自定义 typedef 并使用
    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)。


0
投票

您可以使用 codeant.ai 等工具自动检查和修复代码是否符合 MISRA C 2012。

我写了一篇关于 MISRA C 2012 合规性要求的博客以及示例:

https://www.codeant.ai/blogs/misra-c-2012-rules-examples-pdf

PS:我为 codeant.ai 工作

© www.soinside.com 2019 - 2024. All rights reserved.