首页 > 解决方案 > Valgrind + C:无错误地处理未初始化的指针

问题描述

也许我太忙于测试我的作业,但这是我的困境:

这是我的违规功能(或多或少):

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 在评估x->data它何时尚未初始化NULL或分配时存在问题。有解决方法吗?

标签: cmemory-managementvalgrind

解决方案


在我看来,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;
}

推荐阅读