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