代码之家  ›  专栏  ›  技术社区  ›  Salim

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

  •  1
  • Salim  · 技术社区  · 7 年前

    我正在试图从我的代码中删除违反规则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\u test中初始化var2,方法是调用另一个函数“func”,其中var4被复制到var2。

    它编译得很好,我得到y值=1。

    这是因为func中的参数作为指针,而函数do\u test不知道通过func中的指针进行的值赋值而导致的冲突吗

    是否有任何方法可以解决此问题?

    1 回复  |  直到 7 年前
        1
  •  5
  •   Lundin Makoto    7 年前

    这是许多静态分析器中常见的工具错误。静态分析仪显然无法理解 func 初始化的所有项 var2 ,因此在这条线上得到了假阳性 var2[9] == var4[9] .

    在许多静态分析仪上,代码如 int my_array[10]; initialize(my_array); 给出令人沮丧的误报。“您试图在数组初始化之前初始化它!!!”哦,真的。。。谢谢你,最有用的静态分析器。

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