2010-09-10 72 views
6

Valgrind顯示大小爲8的錯誤的未初始化值。 偶爾,下面的條件跳轉對未初始化值的錯誤。C庫中的Valgrind錯誤?

我所做的只是使用gcc 和內置的vsnprintf附帶的stdC++庫打印格式化的字符串。

這是一種稱爲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) 

回答

5

這是在C圖書館,它實際上是爲了格式化爲一個字符串,看着你的電話號碼的地方,它表示要格式化的數未初始化的存儲來了。

有關未初始化值來源的更多詳細信息,請添加valgrind選項--track-origins=yes

因爲複製未初始化的內存很常見,例如填充結構中,valgrind跟蹤未初始化值的複製,並且不會抱怨,直到實際使用值的位置可能會影響程序的外部可見行爲。這可能會使混淆確定未初始化值的原始來源,因爲在對其進行任何其他操作之前,它可能已被複制多次。選項--track-origins=yes跟蹤附加信息以查明未初始化值的來源,以便在未初始化值結束使用時顯示此信息。

1

如果它表示它在某個標準庫中,則表示您傳入的內容設置不正確。因此,爲了進行調試,請轉到層次結構中的第一行,即代碼...如此:ID :: toString()(id.cpp:151)。

看看周圍正在返回什麼,你會發現你的罪魁禍首。