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)
I가 호출하는 다음 함수 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;
}
추적을 마치면 json_tokener_parse()
으로 입력되는 char []
(또는 const char *
) 변수 buffer
이 초기화되지 않은 것처럼 보입니다. 다시 json_tokener_parse_ex()
으로 입력됩니다.
그러나 변수 은 데이터로 채워지고 json_tokener_parse()
함수가 호출되기 전에 종료됩니다.
valgrind
은 왜이 값이 초기화되지 않았습니까? 내가 뭘 놓치고 있니?
당신의 코드와 주석이 무엇이든 갈 경우,'charCnt'는 사용될 때 초기화되지 않습니다. – GManNickG
또는 아마도'buffer'가 unitialized이며, 단지 NUL로 종료됩니다. – cnicutar
명확성이 부족해서 죄송합니다. 'buffer'가'char' 값으로 채워지면'charCnt' 값이 증가합니다. 그리고 관련 변수 만 복사하여 붙여 넣습니다. 이제는 고정되어있는 '0'으로 초기화된다는 것을 잊지 않습니다. 감사! –