2012-03-29 20 views
5

संभव डुप्लिकेट:
Why do I see strange values when I print uninitialized variables?
Fun with uninitialized variables and compiler (GCC)असंगति

मैं एक रहस्यमय समस्या है, जबकि एक कोड मुद्दे को हल मैं का सामना करना पड़ा जिसके बारे में जानना चाहते हैं।

उत्पादन में मौजूद कोड में एक अनियंत्रित बुलियन चर है और एक पुस्तकालय इस बूलियन के मूल्य की जांच कर रहा है। लाइव साइट में, यह चर TRUE हमेशा व्यवहार कर रहा है विकास वातावरण में एक ही कोड हमेशा FALSE के रूप में व्यवहार कर रहा है।

मुझे पता है, लाइव & DEV के बीच पर्यावरण अंतर के कारण, एक अनियंत्रित बूल चर के पास एक अनिर्धारित मूल्य हो सकता है।

लेकिन यहां मेरा मुद्दा है।

यदि मैं कोड में लॉग स्टेटमेंट डालता हूं, इसे संकलित करता हूं और बाइनरी को विकास पर्यावरण में डालता हूं, तो बूल वैरिएबल हमेशा सत्य होता है, जबकि यह लाइव में कोड के साथ गलत था।

एक लॉग स्टेटमेंट एक अनियमित बूल चर के मान को कैसे प्रभावित करता है? मैं संभावनाओं को जानना चाहता हूं।

+2

http://stackoverflow.com/questions/4879045/fun-with-uninitialized-variables-and-compiler-gcc http://stackoverflow.com/questions/2154132/printing-an-uninitialized के संभावित डुप्लिकेट -बूल-उपयोग-कोउट-सी – Kasma

उत्तर

14

एक अनियंत्रित चर केवल कच्ची मेमोरी का एक टुकड़ा है और जो कुछ भी वहां होने की खुशी के रूप में दिखाया जाएगा। आप सोचते हैं कि "लाइव सिस्टम में यह हमेशा सत्य होता है" पूरी तरह से गलत है। आप बस इतना कह सकते हैं कि हर बार जब आपने इसे लाइव सिस्टम में देखा तो यह सच साबित हुआ। अगले मंगलवार को हो सकता है कि यह झूठा होगा क्योंकि यह अच्छी तरह से ज्ञात है कि अनियमित बूल ट्यूजडे से नफरत करते हैं।

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

मानक कहता है कि मानक पढ़ने के लिए एक अनियमित चर का उपयोग करने के लिए वास्तव में अपरिभाषित व्यवहार हो सकता है, जिसमें क्रैश सहित क्या हो सकता है पर कोई सीमा नहीं है (और उदाहरण के लिए एक अनियमित चर पढ़ने के दौरान प्रोग्राम को "रोकना" आसान है , इस तरह की समस्या को ट्रैक करने के लिए बस एक विशिष्ट उपकरण के साथ संकलित करें)। एक अनियमित चर का उपयोग करने पर हमेशा प्रोग्राम क्रैश होने पर अद्भुत होगा, लेकिन दुर्भाग्यवश यह वर्तमान CPUs पर काफी महंगा है और यह तब तक नहीं होने वाला है जब तक विशिष्ट टूल का उपयोग नहीं किया जाता है।

बेशक केवल printf कॉल जोड़ने से कोड को अनियमित चर के कोडिंग के स्पष्ट व्यवहार को बदल सकते हैं। इस प्रकार की बग को अक्सर "heisenbug" के रूप में जाना जाता है और वास्तव में यादृच्छिक या हेइज़ेनबग व्यवहार अक्सर एक अनियमित चर या थ्रेड सिंक्रनाइज़ेशन समस्या का संकेत होता है।

+1

सिर्फ "यह अच्छी तरह से जाना जाता है कि अनियमित बूल मंगलवार से नफरत करते हैं" – dberm22

2

आप ने कहा:

एक गैर-आरंभिकृत bool चर एक अपरिभाषित मूल्य हो सकता है।

हकीकत में, कि होना चाहिए: "एक गैर-आरंभिकृत bool चर हमेशा एक अपरिभाषित मूल्य है।"

सिर्फ इसलिए कि आपका मूल्य बदल रहा है, यह इस तथ्य को नहीं बदलेगा कि यह अपरिभाषित है। व्यवहार में एकमात्र गारंटी विनिर्देशों द्वारा परिभाषित की गई है। जब तक यह एक स्थिर भंडारण परिभाषा के साथ परिभाषित नहीं किया जाता है, व्यवहार बिल्कुल ठीक है: अपरिभाषित। कंपाइलर इस वैरिएबल के साथ कुछ भी करने के लिए स्वतंत्र है - यह इसे प्रारंभ कर सकता है, हो सकता है कि यह इसे पूरी तरह से अनुकूलित नहीं कर सकता है अगर यह लॉग नहीं किया जा रहा है (यानी: प्रयुक्त), आदि

असल में, आपको अपने बूल को सही ढंग से शुरू करें, और आप इसके बारे में चिंता नहीं कर सकते हैं।

+0

मुझे पता है कि यह हमेशा अनिर्धारित है। लेकिन मैं जानना चाहता हूं कि मामूली परिवर्तन इसके मूल्य को क्यों प्रभावित कर सकता है। यह हमेशा पर्यावरण वातावरण में झूठा है, जब तक कि मैं मामूली परिवर्तन और पुन: संकलित नहीं करता। – cppcoder

+0

यह * अपरिभाषित * है। * कुछ भी * आप संकलक को विभिन्न परिणामों के साथ एक प्रोग्राम उत्पन्न करने का कारण बन सकते हैं और जरूरी नहीं कि किसी भी स्पष्ट कारण से। –