"सशर्त कूद या चाल को इंगित करना अनइंस्टाल्यूटेड वैल्यू (ओं) पर निर्भर करता है" संदेश


166

इसलिए मुझे वाल्ग्रिंड से कुछ रहस्यमयी अनइंस्टाल्यूटेड वैल्यूज़ मेसेज मिल रहे हैं और यह काफी रहस्य है कि खराब वैल्यू की उत्पत्ति कहां से हुई।

ऐसा लगता है कि वैलेग्रिंड उस जगह को दर्शाता है जहाँ इकाई मूल्य का उपयोग किया जा रहा है, लेकिन असमान मूल्य का मूल नहीं है।

==11366== Conditional jump or move depends on uninitialised value(s)
==11366==    at 0x43CAE4F: __printf_fp (in /lib/tls/i686/cmov/libc-2.7.so)
==11366==    by 0x43C6563: vfprintf (in /lib/tls/i686/cmov/libc-2.7.so)
==11366==    by 0x43EAC03: vsnprintf (in /lib/tls/i686/cmov/libc-2.7.so)
==11366==    by 0x42D475B: (within /usr/lib/libstdc++.so.6.0.9)
==11366==    by 0x42E2C9B: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_float<double>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, char, double) const (in /usr/lib/libstdc++.so.6.0.9)
==11366==    by 0x42E31B4: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, double) const (in /usr/lib/libstdc++.so.6.0.9)
==11366==    by 0x42EE56F: std::ostream& std::ostream::_M_insert<double>(double) (in /usr/lib/libstdc++.so.6.0.9)
==11366==    by 0x81109ED: Snake::SnakeBody::syncBodyPos() (ostream:221)
==11366==    by 0x810B9F1: Snake::Snake::update() (snake.cpp:257)
==11366==    by 0x81113C1: SnakeApp::updateState() (snakeapp.cpp:224)
==11366==    by 0x8120351: RoenGL::updateState() (roengl.cpp:1180)
==11366==    by 0x81E87D9: Roensachs::update() (rs.cpp:321)

जैसा कि देखा जा सकता है, यह काफी गूढ़ हो जाता है .. खासकर क्योंकि जब यह क्लास :: मेथडएक्स द्वारा कह रहा है, तो यह कभी-कभी सीधे शुतुरमुर्ग आदि को इंगित करता है। शायद यह अनुकूलन के कारण है?

==11366==    by 0x81109ED: Snake::SnakeBody::syncBodyPos() (ostream:221)

बस असे ही। क्या मुझे कुछ याद आ रहा है? सुपर-लॉन्ग प्रिंटफ डिटेक्टिव वर्क का सहारा लिए बिना बुरे मूल्यों को पकड़ने का सबसे अच्छा तरीका क्या है?

अपडेट करें:

मुझे पता चला कि क्या गलत था, लेकिन अजीब बात यह है कि, वैलगाइंड ने इसकी रिपोर्ट नहीं की थी जब खराब मूल्य का पहली बार उपयोग किया गया था। इसका उपयोग गुणन फ़ंक्शन में किया गया था:

movespeed = stat.speedfactor * speedfac * currentbendfactor.val;

जहां स्पीडफैक एक इकाईगत फ्लोट था। हालाँकि, उस समय यह सूचित नहीं किया गया था और तब तक नहीं जब तक कि मूल्य मुद्रित नहीं किया जाना है कि मुझे त्रुटि मिलती है .. क्या इस व्यवहार को बदलने के लिए वैलग्राइंड की कोई सेटिंग है?

जवाबों:


230

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

अद्यतन: उस बिंदु के बारे में, जिस पर अनधिकृत मूल्य की सूचना दी जाती है, वैलेरिंड मैनुअल कहता है :

यह समझना महत्वपूर्ण है कि आपका कार्यक्रम जंक (अनइंस्टॉलिज्ड) डेटा के आसपास कॉपी कर सकता है जितना इसे पसंद है। मेमचेक इसका अवलोकन करता है और डेटा पर नज़र रखता है, लेकिन शिकायत नहीं करता है। एक शिकायत केवल तब जारी की जाती है जब आपका कार्यक्रम एक तरह से बिना डेटा के उपयोग करने का प्रयास करता है जो आपके कार्यक्रम के बाहरी रूप से दिखाई देने वाले व्यवहार को प्रभावित कर सकता है।

से वेलग्रिंड पूछे जाने वाले प्रश्न :

असमान स्मृति मूल्यों की प्रतियों की उत्सुक रिपोर्टिंग के लिए, यह कई बार सुझाया गया है। दुर्भाग्य से, लगभग सभी कार्यक्रम वैध रूप से असमान स्मृति मूल्यों की नकल करते हैं (क्योंकि संरेखण को संरक्षित करने के लिए पैड संरचनाएं) और उत्सुक जाँच सैकड़ों झूठी सकारात्मकता की ओर ले जाती हैं। इसलिए मेमचेक इस समय उत्सुक जाँच का समर्थन नहीं करता है।


1
इस सुविधा का उपयोग करने के लिए न्यूनतम वैध संस्करण क्या है? मैं 3.3.0 का उपयोग कर रहा हूं और यह विकल्प पसंद नहीं करता है।
रॉबर्ट एस। बार्न्स

8
@Robert: - ट्रैक-ऑरिजिन को वैलगाइंड 3.4.0 में जोड़ा गया था
mark4o

20

इसका मतलब यह है कि आप एक ऐसे मूल्य का प्रिंट आउट / आउटपुट करने की कोशिश कर रहे हैं जो कम से कम आंशिक रूप से असंगठित है। क्या आप इसे कम कर सकते हैं ताकि आपको पता चले कि वास्तव में क्या मूल्य है? उसके बाद, अपने कोड के माध्यम से देखें कि यह कहां से आरंभ किया जा रहा है। संभावना है, आप देखेंगे कि इसे पूरी तरह से शुरू नहीं किया जा रहा है।

यदि आपको अधिक सहायता की आवश्यकता है, तो स्रोत कोड के संबंधित अनुभागों को पोस्ट करने से कोई व्यक्ति अधिक मार्गदर्शन दे सकता है।

संपादित करें

मैं देख रहा हूँ कि आपको समस्या मिल गई है। ध्यान दें कि कंडिशंल जंप के लिए वैलग्राइंड देखता है या यूनिटियल वैरिएबल पर आधारित है। इसका मतलब यह है कि यह केवल एक चेतावनी देगा अगर कार्यक्रम के निष्पादन को एकात्मक मूल्य के कारण बदल दिया जाता है (यानी, उदाहरण के लिए कार्यक्रम एक अलग शाखा लेता है, उदाहरण के लिए)। चूंकि वास्तविक अंकगणित में सशर्त कूद या चाल शामिल नहीं थी, इसलिए वैलेग्रिंड ने आपको इसके बारे में चेतावनी नहीं दी थी। इसके बजाय, इसने उपयोग किए जाने वाले बयान के परिणाम के लिए "असंवैधानिक" स्थिति का प्रचार किया।

यह उल्टा लग सकता है कि यह आपको तुरंत चेतावनी नहीं देता है, लेकिन जैसा कि mark4o ने बताया है, यह ऐसा इसलिए होता है क्योंकि अनैतिक तरीके से C को हर समय इस्तेमाल किया जाता है (उदाहरण: संरचनाओं में पैडिंग, realloc()कॉल इत्यादि) इसलिए उन चेतावनियों को स्वीकार नहीं किया जाएगा। झूठी सकारात्मक आवृत्ति के कारण बहुत उपयोगी है।


धन्यवाद। मुझे अभी पता चला है कि क्या गलत था, लेकिन अजीब बात यह है, वैलेरिंड ने यूनिटाइज्ड वैल्यू चीज़ की रिपोर्ट नहीं की, जब तक कि इसे कहीं और इस्तेमाल नहीं किया गया ..
kamziro

वह जानबूझकर है। अगर सिर्फ नकल करना या एकतरफा मूल्यों के आसपास से गुजरना एक त्रुटि रिपोर्ट का कारण बनता है, तो आप उन्हें संरचनाओं में पैडिंग से हर समय प्राप्त करेंगे।
निशान 4
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.