Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C MISRA 5.2规则:混淆_C_Misra - Fatal编程技术网

C MISRA 5.2规则:混淆

C MISRA 5.2规则:混淆,c,misra,C,Misra,我的项目中违反了MISRA 5.2规则。我得到的冲突代码是在一个头文件中声明为extern的结构。代码示例如下所示 1.h 2.c 3.c 我只在struct-con-tmp\u-ev行的2.c中得到警告这么说 符号tmp_ev声明隐藏符号tmp_ev 而不是在3.c。c和3.c都包含1.h头文件 我不明白为什么会出现这个问题。有人能帮我解决这个问题吗?规则5.2规定,局部范围内的变量不应隐藏具有相同名称的全局变量 您有一个名称为tmp_ev的局部变量和一个名称相同的全局变量。局部的正在跟踪全局

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

1.h

2.c

3.c

我只在
struct-con-tmp\u-ev行的2.c中得到警告这么说

符号tmp_ev声明隐藏符号tmp_ev

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


我不明白为什么会出现这个问题。有人能帮我解决这个问题吗?

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


您有一个名称为
tmp_ev
的局部变量和一个名称相同的全局变量。局部的正在跟踪全局的。重命名本地的或全局的。

您应该了解“声明”和“定义”的区别 C-对象。一个对象可能只有一个“定义”,但任意多个“声明”。“声明”仅仅是一个对象存在的声明。“定义”确立了这种存在
extern
始终是其他地方(或“此处”)的对象声明,而不是“定义”

声明
类型变量总是生成
在其C文件中对
变量
的定义(称为“暂定定义”)

我对misra不太熟悉(目前我自己也在学习) 但您的架构很混乱:

文件
1.h
声明一个全局范围的外部
tmp\u ev

文件
2.c
定义了一个具有全局范围的变量
tmp\u ev
。(a“暂定定义”)

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

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


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

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

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

注:也正在讨论中,并已生成以下回复:

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

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

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


您有两个同名的不同变量。删除其中一个,这样您的Misra检查器和链接器都不必对此抱怨。
extern
/spaghetti编程的使用首先是可疑的,Misra或no Misra。@Lundin:我需要在不同的文件中使用该变量,因此我在头文件中将其用作extern。如果我的代码中仍然存在一些错误,那么请告诉我,因为我是新手,可能做了一些错误的事情way@AnkitShah这就是为什么我们使用setter/getter。使用
extern
是代码的问题所在。当可以使用时,很少有例外,基本上只有在使用
const
变量时。我认为你是对的,但现在的问题是,我在不同的文件中有两个同名的局部变量。所以,工具也应该显示MISRA 5.2违规的警告。但它并没有在那里显示出来。它只显示在一个文件中。这两个文件都包含头文件。你知道这背后的原因吗?这是关于工具本身的。可能设置为不在同一全局上多次报告同一违规行为。只是猜测而已。重命名其中一个,看看它是否会开始抱怨第二个。我重命名了局部变量并构建了项目,然后执行了检查,现在它可以正常工作,没有任何冲突。对于另一个文件,我会打电话给工具供应商询问这一点。谢谢你的支持answer@AnkitShah许多静态分析器工具在面对多个.c文件时表现糟糕。此外,旧的MISRA-C:2004在这里有一些奇怪的规则,这些规则在MISRA-C:2012中被重新制定或删除。我建议升级到后者,因为MISRA-C:2004的标识符章节相当糟糕。
extern struct con tmp_ev;
struct con tmp_ev;
cioF_get(&tmp_ev);
struct con tmp_ev;
 (void)eeF_read(CON, &tmp_ev);