Valgrind + C:处理未初始化的指针而没有错误

问题描述 投票:0回答:1

也许我参与了我的作业测试,但这是我的两难境地:

这是我的冒犯功能(或多或少):

struct thing{
    char* data;
}

int function(struct thing* arg){
    if(arg->data == NULL)
        return -1; 
}

这是我的冒犯性输入:

struct thing *x = malloc(sizeof(struct thing));
function(x);

并且valgrind在测试时输出此:

Conditional jump or move depends on uninitialised value(s)

我大约99%的确定这是因为valgrind在尚未初始化为NULL或未分配时,在评估x->data时存在问题。有没有解决方法?

c memory-management valgrind
1个回答
0
投票

我认为valgrind在这里抱怨是正确的,因为data实际上未初始化,并且function无法确定是否初始化。该函数只能检查它是否具有用于初始化的定义值。

所以我会考虑使用创建函数来执行初始化。这样,您还可以在将其大小作为参数传递时立即为数据分配内存(或者,如果您以后想要这样做,则只需分配NULL)。

struct thing *newThing(size_t dataSize)
{
   struct thing *t = malloc(sizeof (struct thing));

   if (t)
      t->data = malloc(sizeof(char) * dataSize);
      // or t->data = NULL if it should be done later

   return t;
}
© www.soinside.com 2019 - 2024. All rights reserved.