MISRA C 2012规则9.1读取未初始化的价值[重复]

问题描述 投票:-2回答:3

这个问题在这里已有答案:

我正面临违反规则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的情况下编写相同的代码

c misra
3个回答
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;
}

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


1
投票

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

引用C11,章节§6.7.9

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

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

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


-1
投票

虽然MISRA的一些规则接近于异想天开的特殊教条式迂腐,但是关于阅读未初始化变量的这一规则直接取自语言本身:除了少数例外,读取未初始化变量的行为未定义。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.