我在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
說這個值是未初始化?我錯過了什麼?
如果你的代碼和註釋是任何事情都可以通過,'charCnt'在使用時是未初始化的。 – GManNickG
或者'也許'緩衝區'是單元化的,只是NUL終止。 – cnicutar
對不起,不清楚。當'buffer'填充'char'值時,'charCnt'值遞增。而我正在複製和粘貼相關變量。我忘了寫它已被初始化爲'0',現在已經修復。謝謝! –