Ошибки Valgrind в библиотеках c? - PullRequest
       25

Ошибки Valgrind в библиотеках c?

6 голосов
/ 10 сентября 2010

Valgrind показывает неинициализированное значение ошибки размера 8.И иногда условный переход ниже при ошибке неинициализированного значения.

Все, что я делаю, - это печать форматированной строки с использованием библиотеки stdc ++, которая поставляется с gcc, и встроенного vsnprintf.

Этовнутри метода с именем format, который является частью пользовательского строкового класса.Что теперь?все выглядит правильно.Кажется, ошибка внутри _itoa.c.Но все, что я могу сделать снаружи - это не использовать эту функцию, что не очень возможно!

==4229== Memcheck, a memory error detector
==4229== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==4229== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==4229== Command: ./test
==4229== 
==4229== Use of uninitialised value of size 8
==4229==    at 0x54A3DF1: _itoa_word (_itoa.c:196)
==4229==    by 0x54A5138: vfprintf (vfprintf.c:1613)
==4229==    by 0x555C74F: __vsnprintf_chk (vsnprintf_chk.c:65)
==4229==    by 0x407E57: myString::format(char const*, ...) (stdio2.h:79)
==4229==    by 0x419D14: ID::toString() (id.cpp:151)
==4229==    by 0x41D03D: main (test.cpp:126)
==4229== 
==4229== Conditional jump or move depends on uninitialised value(s)
==4229==    at 0x54A3DF8: _itoa_word (_itoa.c:196)
==4229==    by 0x54A5138: vfprintf (vfprintf.c:1613)
==4229==    by 0x555C74F: __vsnprintf_chk (vsnprintf_chk.c:65)
==4229==    by 0x407E57: myString::format(char const*, ...) (stdio2.h:79)
==4229==    by 0x419D14: ID::toString() (uuid.cpp:151)
==4229==    by 0x41D03D: main (test.cpp:126)
==4229== 
==4229== 
==4229== HEAP SUMMARY:
==4229==     in use at exit: 0 bytes in 0 blocks
==4229==   total heap usage: 6 allocs, 6 frees, 1,340 bytes allocated
==4229== 
==4229== All heap blocks were freed -- no leaks are possible
==4229== 
==4229== For counts of detected and suppressed errors, rerun with: -v
==4229== Use --track-origins=yes to see where uninitialised values come from
==4229== ERROR SUMMARY: 3 errors from 2 contexts (suppressed: 4 from 4)

Ответы [ 2 ]

6 голосов
/ 12 сентября 2010

Это место в библиотеке C, где оно фактически просматривает ваш номер, чтобы отформатировать его как строку, и это указывает на то, что форматируемый вами номер получен из неинициализированного хранилища.

Добавьте параметр valgrind --track-origins=yes для получения дополнительной информации о происхождении неинициализированного значения.

Поскольку обычно копируют неинициализированную память, например, Заполняя структуры, valgrind отслеживает копирование неинициализированных значений и не жалуется до момента, когда значение фактически используется таким образом, что это может повлиять на внешне видимое поведение вашей программы. Это может ввести в заблуждение определение исходного источника неинициализированного значения, поскольку оно могло быть скопировано несколько раз, прежде чем что-либо еще было сделано с ним. Опция --track-origins=yes отслеживает дополнительную информацию, чтобы точно определить происхождение неинициализированного значения, чтобы ее можно было отобразить в случае использования неинициализированного значения.

1 голос
/ 12 сентября 2010

Если он говорит, что находится в одной из стандартных библиотек, это означает, что то, что вы передаете, неправильно настроено. Поэтому для отладки перейдите к первой строке в иерархии, в которой находится ваш код ... так: ID :: toString () (id.cpp: 151).

Посмотрите, что там возвращается, и вы найдете своего виновника.

...