MISRA C 2012规则9.1读取未初始化的价值

时间:2017-12-19 04:44:29

标签: c misra

我正面临违反规则9.1的情况。 我想在初始化之前读取一个auto变量(在声明时有垃圾值),如果它不为null则指定null。如果它为null,则具有不同的值。 示例代码:

{ 
    int8_t reg_num; 
    uint64_t var1[NUM]; 
    for (reg_num = 0; reg_num < NUM; reg_num++) {
        if (var1[reg_num] != VAR_NULL) { 
            var1 [reg_num] = VAR_NULL; 
        } else { 
            var1[reg_num] = func1(); 
        } 
    } 
}

违规行为是if (var1[reg_num] != VAR_NULL)在初始化之前var1[reg_num]正在读取的行。

有没有办法在不违反9.1

的情况下编写相同的代码

3 个答案:

答案 0 :(得分:1)

报告错误的工具是正确的。

引用C11,章节§6.7.9

  

如果没有显式初始化具有自动存储持续时间的对象,则其值为   不定。 [....]

为避免这种情况,您可以在定义时将数组初始化为某个值,例如0。这样,每个元素中都有一个可预测的值。

要添加,它对上述逻辑没有任何意义(即,通常检查未通过变量的值),它最多会调用undefined behavior。不要这样做。

答案 1 :(得分:1)

您所要做的就是初始化变量。在学习C时,这实际上是规则#2 - 非常非常基本的材料。 MISRA规则只是告诉您遵循C中的基本规则。

#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>

#define NUM 10

/* assumes your VAR_NULL is zero */
#define VAR_NULL 0LLU

uint64_t func1(void)
{
  return 3LLU;
}

int main(void)
{
  int8_t reg_num = 0;
  uint64_t var1[NUM] = { 0LLU };
  for (; reg_num < NUM; reg_num++)
  {
    var1[reg_num] = func1();
  }
  getchar();
  return 0;
}

使用初始化变量,阵列初始化代码当然是简化的。如果您错过了它,关键是在定义变量时初始化变量。

答案 2 :(得分:-1)

尽管MISRA的一些规则接近于异想天开的特殊教条式迂腐,但是这个关于阅读未初始化变量的规则直接从语言本身中解除了:除了少数例外,读取未初始化变量的行为是 undefined

不要这样做:MISRA或没有MISRA。

在您的情况下,您可以写uint64_t var1[NUM] = {0};