Я запускаю debug-версию моего двоичного кода C в пределах valgrind
, который возвращает многочисленные ошибки сортировки 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
Или, может быть, 'buffer' является унифицированным, только NUL-terminated. – cnicutar
Извините за отсутствие ясности. Когда 'buffer' заполняется значениями' char', значение 'charCnt' увеличивается. И я копирую и вставляю только релевантные переменные. Я забыл написать, что он инициализирован '0', который теперь исправлен. Благодаря! –