也许我参与了我的作业测试,但这是我的两难境地:
这是我的冒犯功能(或多或少):
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
时存在问题。有没有解决方法?
我认为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;
}