MISRA C 2012违反规则9.1,即使使用初始化变量
我试图从我的代码中删除违反规则9.1的行为 规则9.1:具有自动存储持续时间的对象的值在设置之前不得读取 示例代码:MISRA C 2012违反规则9.1,即使使用初始化变量,c,misra,C,Misra,我试图从我的代码中删除违反规则9.1的行为 规则9.1:具有自动存储持续时间的对象的值在设置之前不得读取 示例代码: #include <stdint.h> #include <stdbool.h> #define VAL 0xABCDEFABU int32_t main(void); static int32_t do_test(bool k); static void func(uint64_t *var3, const uint64_t *var5); int3
#include <stdint.h>
#include <stdbool.h>
#define VAL 0xABCDEFABU
int32_t main(void);
static int32_t do_test(bool k);
static void func(uint64_t *var3, const uint64_t *var5);
int32_t
main (void)
{
bool b = false;
int32_t y = do_test(b);
return y;
}
static int32_t
do_test(bool k)
{
uint64_t i = 0, var4[10];
int32_t result = 0;
for(i = 0U; i < 10U; i++) {
var4[i] = VAL + i;
}
if(k == false) {
uint64_t var2[10];
func(var2, var4);
if(var2[9] == var4[9]) {
result = 1;
}
}
return result;
}
static void
func(uint64_t *var3, const uint64_t *var5)
{
int32_t i;
for(i = 0; i < 10; i++) {
var3[i] = var5[i];
}
}
#包括
#包括
#定义VAL 0xABCDEFABU
int32_t main(无效);
静态int32_t do_测试(bool k);
静态无效函数(uint64_t*var3,const uint64_t*var5);
int32\u t
主(空)
{
布尔b=假;
int32_t y=do_试验(b);
返回y;
}
静态int32\t
do_测试(布尔克)
{
uint64_t i=0,var4[10];
int32_t结果=0;
对于(i=0U;i<10U;i++){
var4[i]=VAL+i;
}
如果(k==false){
uint64_t var2[10];
func(var2,var4);
if(var2[9]==var4[9]){
结果=1;
}
}
返回结果;
}
静态空隙
func(uint64\u t*var3,const uint64\u t*var5)
{
int32_t i;
对于(i=0;i<10;i++){
var3[i]=var5[i];
}
}
我在函数do_test中初始化var2,方法是调用另一个函数“func”,其中var4被复制到var2
编译很好,我得到y值=1
这是因为func中的参数作为指针,而函数do_test不知道通过func中的指针进行的值赋值而导致的冲突吗
是否有办法解决此问题?这是许多静态分析仪中常见的工具错误。您的静态分析器显然无法理解函数
func
初始化了var2
的所有项,因此您在var2[9]==var4[9]
行上得到了假阳性
在许多静态分析仪上,代码如int my_数组[10];初始化(我的数组)代码>给出令人沮丧的误报。“你试图在数组初始化之前初始化它!!!”哦,真的。。。谢谢,非常有用的静态分析器
你的代码很好。向工具供应商提交错误报告。这是许多静态分析仪中常见的工具错误。您的静态分析器显然无法理解函数func
初始化了var2
的所有项,因此您在var2[9]==var4[9]
行上得到了假阳性
在许多静态分析仪上,代码如int my_数组[10];初始化(我的数组)代码>给出令人沮丧的误报。“你试图在数组初始化之前初始化它!!!”哦,真的。。。谢谢,非常有用的静态分析器
你的代码很好。向工具供应商提交错误报告。是否初始化了var3
或var5
?var5[i]
是否已初始化?显然没有,所以这并不违反规则。出于好奇,哪个工具发出了警告?我想我还没有找到一个没有这个bug的。函数:main()
在C中是特殊的,不要对它进行原型化。使用返回类型int
,阅读以了解“规则集”以及如何操作它们。详细信息:“我正在…函数“func”中初始化var2。C将其描述为分配var2
的元素。要初始化var2
,请使用uint64\u t var4[10]={something}代码>之后的任何内容都是赋值。是否初始化了var3
或var5
?var5[i]
是否已初始化?显然没有,所以这并不违反规则。出于好奇,哪个工具发出了警告?我想我还没有找到一个没有这个bug的。函数:main()
在C中是特殊的,不要对它进行原型化。使用返回类型int
,阅读以了解“规则集”以及如何操作它们。详细信息:“我正在…函数“func”中初始化var2。C将其描述为分配var2
的元素。要初始化var2
,请使用uint64\u t var4[10]={something}代码>之后的任何内容都是赋值。@LundinI对switch语句有相同的违规行为:switch(val){case 0:result=1;break;case 1:result=2;break;case 2:if(temp==1){result=2;}int32_t a=10;a+=5;结果=a;中断;案例3:结果=4;中断;默认值:结果=0;中断;}。当我为案例2引入花括号时,问题得到了解决。原因可能是什么?@Salim Tool bugs。“我面临着另一个违反规则9.1的情况。我想在初始化之前读取一个自动变量(在声明时具有垃圾值),如果它不是null,则分配null。如果为空,则使用不同的值。示例代码:{int8_t reg_num;uint64_t var1[num];for(reg_num=0;reg_numuint64\u t var1[NUM]={0}代码>。修正了错误。作为奖励,您的代码变得更快,可读性更强。@LundinI得到了与switch语句相同的违规行为:switch(val){case 0:result=1;break;case 1:result=2;break;case 2:if(temp==1){result=2;}int32_t a=10;a+=5;结果=a;中断;案例3:结果=4;中断;默认值:结果=0;中断;}。当我为案例2引入花括号时,问题得到了解决。原因可能是什么?@Salim Tool bugs。“我面临着另一个违反规则9.1的情况。我想去看电影