MISRA 5.2规则:混乱

时间:2018-03-01 16:29:37

标签: c misra

我的项目中违反了MISRA 5.2规则。我遇到违规的代码是在一个头文件中声明为extern的结构。代码示例如下

1.H

extern struct con tmp_ev;

2.C

struct con tmp_ev;
cioF_get(&tmp_ev);

3.C

struct con tmp_ev;
 (void)eeF_read(CON, &tmp_ev);

我只在行struct con tmp_ev;中的2.c中发出警告

  

符号tmp_ev的声明隐藏了符号tmp_ev

而不是3.c。 2.c和3.c都包含1.h头文件。

我很困惑为什么会出现这个问题。任何人都可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:3)

规则5.2规定本地范围内的变量不应隐藏具有相同名称的全局变量

您有名为tmp_ev的局部变量和具有相同名称的全局变量。当地人正在影响全球的人。重命名本地或全局。

答案 1 :(得分:2)

你应该学习“声明”和“定义”之间的区别 C-物体。可能只有一个对象的“定义”,但任意多的“声明”。 “声明”仅仅是对象存在的一种陈述。 “definiton”确定了存在。 extern始终是其他地方(或“此处”)的对象声明,而不是“定义”。

C文件中没有Type variable;的声明extern总是产生 {C}文件中variable的定义(称为“暂定定义”)。

我对misra不熟悉(目前正在学习) 但你的架构很混乱:

文件1.h 声明一个具有全局范围的extern tmp_ev

文件2.c 定义具有全局范围的变量tmp_ev。 (“暂定”)。

文件3.c 定义另一个变量tmp_ev(同样是“暂定定义”)也具有全局范围。

因此,C文件中tmp_ev的两个定义竞争。您现在应该决定哪个C文件(别名“编译单元”)有权定义 tmp_env。所有其他C文件应使用extern 声明,最好使用#include "1.h"

请注意,C文件可以“声明”它“定义”的变量。在C程序员中,在某个标题foo_var中声明变量foo.h并且在名为关联的C文件中定义,这是一个常见的习惯用法foo.c本身包含foo.h

答案 2 :(得分:0)

提供的代码段不应生成MISRA-C:2004规则5.2违规,因为没有内部范围和外部范围的嵌套。

但是,这违反了MISRA-C:2004规则8.9,因为您在全球范围内有tmp_ev的两个(暂定)定义。

注意:也在"official" MISRA Forum上进行了讨论,并产生了以下回复:

  

规则5.2仅适用于内部范围中的标识符。从示例中不清楚2.c和3.c中的代码是存在于文件范围内还是存在于函数内。

     

如果" struct con tmp_ev" 2.c和3.c出现在函数定义中,将违反规则5.2。

     

如果" struct con tmp_ev"出现在文件范围内,违反了规则8.9,因为有两个(暂定的)定义" struct con tmp_ev"在项目中。