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

时间:2017-12-14 10:31:32

标签: 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);

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];
    }

}

我通过调用另一个函数&#34; func&#34;来在函数do_test中初始化var2。其中var4被复制到var2。

编译正常,我得y值= 1.

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

有没有解决这个问题?

1 个答案:

答案 0 :(得分:5)

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

在许多静态分析器上,int my_array[10]; initialize(my_array);之类的代码会产生令人沮丧的误报。 “你尝试在数组初始化之前初始化它!”哦,真的......谢谢你,最有帮助的静态分析仪。

你的代码很好。向您的工具供应商提交错误报告。