MISRA C 2012 违反规则 9.1,即使使用初始化变量

MISRA C 2012 violation of rule 9.1 even with an initialized variable

我正在尝试从我的代码中删除违规规则 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];
    }

}

我正在函数 do_test 中初始化 var2,方法是调用另一个函数 "func",其中 var4 被复制到 var2。

编译正常,我得到 y 值 = 1。

是否由于 func 中的参数作为指针而导致违规,并且函数 do_test 没有意识到通过 func 中的指针赋值

有什么方法可以解决这个问题吗?

这是许多静态分析器中的常见工具错误。您的静态分析器显然无法理解函数 func 初始化了 var2 的所有项目,因此您在行 var2[9] == var4[9].

上得到误报

在许多静态分析器上,int my_array[10]; initialize(my_array); 等代码会给出令人沮丧的误报。 "You try to initialize the array before it has been initialized!!!"哦真的...谢谢你,最有帮助的静态分析器。

你的代码没问题。向您的工具供应商提交错误报告。