Valgrind errors in c libraries?

2019-06-19 18:49发布

Valgrind is showing an uninitialised value of size 8 error. And occasionally, the below conditional jump on uninitialised value error.

All I'm doing is printing a formatted string using the stdc++ library that comes with gcc and the built in vsnprintf.

This is inside a method called format which is part of a custom string class. What now? everything looks correct. Error seems to be inside _itoa.c. But all I can think of to do on the outside is not use this function, which is not very possible!

==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)

标签: gcc valgrind
2条回答
smile是对你的礼貌
2楼-- · 2019-06-19 19:13

This is the place in the C library where it is actually looking at your number in order to format it as a string, and it indicates that the number you are formatting came from uninitialized storage.

Add the valgrind option --track-origins=yes for more details on the origin of the uninitialized value.

Because it is common to copy around uninitialized memory, e.g. padding in structures, valgrind tracks copying of uninitialized values and does not complain until the point where the value is actually used in a way that might affect your program's externally-visible behavior. This can make it confusing to determine the original source of the uninitialized value, since it may have been copied several times before anything else was done with it. The option --track-origins=yes tracks additional information to pinpoint the origin of the uninitialized value, so that this can be displayed in the event that the uninitialized value ends up being used.

查看更多
看我几分像从前
3楼-- · 2019-06-19 19:22

If it says it is in one of the standard libraries, it means something you are passing in isn't set up properly. So in order to debug, go to the first line in the hierarchy which is your code ... so: ID::toString() (id.cpp:151).

Look around what is being returned there, and you will find your culprit.

查看更多
登录 后发表回答