MISRA C 2012违反规则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

我试图从我的代码中删除违反规则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);

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的情况。我想去看电影