Valgrind errors in c libraries?

心已入冬 提交于 2019-12-08 20:18:10

问题


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)

回答1:


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.




回答2:


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.



来源:https://stackoverflow.com/questions/3681652/valgrind-errors-in-c-libraries

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!