2010-09-10 13 views
6

वालग्रिंड आकार 8 त्रुटि का एक प्रारंभिक मूल्य दिखा रहा है। और कभी-कभी, अनियमित मूल्य त्रुटि पर नीचे सशर्त कूद।सी पुस्तकालयों में त्रुटिपूर्ण त्रुटियां?

मैं बस इतना कर रहा हूं कि stccC++ लाइब्रेरी का उपयोग करके एक स्वरूपित स्ट्रिंग मुद्रित कर रहा है जो gcc और अंतर्निहित बनामप्रिंटफ के साथ आता है।

यह प्रारूप नामक एक विधि के अंदर है जो कस्टम स्ट्रिंग क्लास का हिस्सा है। अब क्या? सब ठीक दिखता है। त्रुटि _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

यह सी पुस्तकालय जहां यह वास्तव में आदेश एक स्ट्रिंग के रूप में यह फ़ॉर्मेट करने के लिए में अपना नंबर में दिख रही है में जगह है, और यह इंगित करता है कि नंबर पर आप स्वरूपण कर रहे हैं अप्रारंभीकृत भंडारण से आया है।

अनियमित मूल्य की उत्पत्ति के बारे में अधिक जानकारी के लिए valgrind विकल्प --track-origins=yes जोड़ें।

क्योंकि अनियमित स्मृति के आसपास प्रतिलिपि बनाना आम है, उदा। संरचनाओं में पैडिंग, अनियमित मानों की प्रतिलिपि बनाने वाले वाल्ग्रिंड ट्रैक और उस बिंदु तक शिकायत नहीं करते हैं जब मूल्य वास्तव में इस तरह से उपयोग किया जाता है जो आपके प्रोग्राम के बाहरी रूप से दिखाई देने वाले व्यवहार को प्रभावित कर सकता है। यह अनियमित मूल्य के मूल स्रोत को निर्धारित करने में भ्रमित कर सकता है, क्योंकि इसके साथ किसी और चीज से पहले इसे कई बार कॉपी किया गया हो सकता है। विकल्प --track-origins=yes अनियमित मूल्य की उत्पत्ति को इंगित करने के लिए अतिरिक्त जानकारी ट्रैक करता है, ताकि यह उस घटना में प्रदर्शित किया जा सके जब अनियमित मूल्य का उपयोग समाप्त हो रहा है।

1

यदि यह कहता है कि यह मानक पुस्तकालयों में से एक में है, तो इसका मतलब है कि आप जो कुछ पारित कर रहे हैं वह ठीक से स्थापित नहीं है। तो डीबग करने के लिए, पदानुक्रम में पहली पंक्ति पर जाएं जो आपका कोड है ... इसलिए: आईडी :: toString() (id.cpp: 151)।

वहां वापस क्या किया जा रहा है, इसके चारों ओर देखो, और आप अपने अपराधी को पा सकते हैं।

संबंधित मुद्दे