【发布时间】:2011-12-24 10:29:58
【问题描述】:
我在 valgrind 中运行我的 C 二进制文件的调试版本,它返回了许多类似于 Conditional jump or move depends on uninitialised value(s) 的错误。
使用符号表,valgrind 告诉我在我的程序中查找此问题的位置:
==23899== 11 errors in context 72 of 72:
==23899== Conditional jump or move depends on uninitialised value(s)
==23899== at 0x438BB0: _int_free (in /foo/bar/baz)
==23899== by 0x43CF75: free (in /foo/bar/baz)
==23899== by 0x4179E1: json_tokener_parse_ex (json_tokener.c:593)
==23899== by 0x418DC8: json_tokener_parse (json_tokener.c:108)
==23899== by 0x40122D: readJSONMetadataHeader (metadataHelpers.h:345)
==23899== by 0x4019CB: main (baz.c:90)
我有以下函数readJSONMetadataHeader(...) 调用json_tokener_parse():
int readJSONMetadataHeader(...) {
char buffer[METADATA_MAX_SIZE];
json_object *metadataJSON;
int charCnt = 0;
...
/* fill up the `buffer` variable here; basically a */
/* stream of characters representing JSON data... */
...
/* terminate `buffer` */
buffer[charCnt - 1] = '\0';
...
metadataJSON = json_tokener_parse(buffer);
...
}
函数json_tokener_parse()依次如下:
struct json_object* json_tokener_parse(const char *str)
{
struct json_tokener* tok;
struct json_object* obj;
tok = json_tokener_new();
obj = json_tokener_parse_ex(tok, str, -1);
if(tok->err != json_tokener_success)
obj = (struct json_object*)error_ptr(-tok->err);
json_tokener_free(tok);
return obj;
}
跟踪回到readJSONMetadataHeader(),似乎未初始化的值是char [](或const char *)变量buffer,它被馈送到json_tokener_parse(),而后者又被馈送到json_tokener_parse_ex() .
但是buffer 变量会被数据填充,然后在调用json_tokener_parse() 函数之前终止。
那么为什么valgrind 说这个值是未初始化的呢?我错过了什么?
【问题讨论】:
-
如果您的代码和 cmets 可以参考,
charCnt在使用时未初始化。 -
或者
buffer是未初始化的,只是 NUL 终止的。 -
抱歉,不够清晰。当
buffer填充有char值时,charCnt值会递增。而且我只复制和粘贴相关变量。我忘记写它已初始化为0,现在已修复。谢谢!