2010-04-16 4 views
9

मुझे पता है कि डिबगिंग विकल्पों के तहत विजुअल स्टूडियो एक ज्ञात मान के साथ स्मृति भर जाएगा। क्या जी ++ (कोई संस्करण, लेकिन जीसीसी 4.1.2 सबसे दिलचस्प है) क्या कोई विकल्प है जो पहचानने योग्य मानों के साथ एक अनियमित स्थानीय पीओडी संरचना भर सकता है?ज्ञात मूल्यों के साथ जी ++ अनियमित पीओडी चर भर सकते हैं?

struct something{ int a; int b; }; 
void foo() { 
    something uninitialized; 
    bar(uninitialized.b); 
} 

मुझे उम्मीद है कि uninitialized.b अप्रत्याशित यादृच्छिकता होने के लिए; स्पष्ट रूप से एक बग और आसानी से पाया गया कि अनुकूलन और चेतावनियां चालू हैं या नहीं। लेकिन केवल 0 जीचेतावनी के साथ संकलित। एक सहयोगी के पास ऐसा मामला था जहां इस तरह के कोड काम करते थे क्योंकि संयोग से वैध मूल्य था; जब संकलक ने अपग्रेड किया, तो यह असफल हो गया। उन्होंने सोचा कि ऐसा इसलिए था क्योंकि नया संकलक संरचना (ज्ञात तरीका है कि वीएस 0xCC भरता है) में ज्ञात मान डाल रहा था। अपने अनुभव में, यह अलग-अलग यादृच्छिक मान था जो मान्य नहीं होते थे।

लेकिन अब मैं उत्सुक हूं - क्या जी ++ की कोई सेटिंग है जो इसे मेमोरी भर देगी जो मानक अन्यथा कहलाए जाने वाले को अनियमित किया जाना चाहिए?

उत्तर

3

मुझे नहीं लगता कि ऐसा विकल्प/सुविधा gcc/g ++ में मौजूद है।

उदाहरण के लिए, सभी वैश्विक (और स्थैतिक) चर .bss अनुभाग में रहते हैं, जो हमेशा शून्य के लिए शुरू किया जाता है। हालांकि, संगतता के लिए .bss के भीतर अनियंत्रित लोगों को एक विशेष खंड में रखा जाता है।

यदि आप उन्हें भी शून्य करना चाहते हैं, तो आप संकलक को -fno-common तर्क दे सकते हैं। या, यदि आपको प्रति-चरणीय आधार पर इसकी आवश्यकता है, तो __attribute__ ((nocommon)) का उपयोग करें।

ढेर के लिए, आपके द्वारा वर्णित किए गए कार्यों को पूरा करने के लिए अपना स्वयं का आवंटन लिखना संभव है। लेकिन ढेर के लिए, मुझे नहीं लगता कि एक आसान समाधान है।

+0

मुझे नहीं लगता था कि यह सुविधा मौजूद थी, लेकिन जीसीसी मैनुअल लंबा और गहरा है, और इससे पहले कि वहां क्या छिपा हुआ है, मैं आश्चर्यचकित हूं। –

1

मुझे विश्वास नहीं है कि g ++ इस तरह के सभी मामलों का पता लगाएगा, लेकिन Valgrind निश्चित रूप से होगा।

+0

हां, अन्य विश्लेषण उपकरण समाधान प्रतीत होते हैं। कुछ ऐसा लगता है जैसे संकलक व्यवस्था कर सकता है, लेकिन अगर ऐसा नहीं होता तो आश्चर्यजनक नहीं है। –

4

किसी भी सी ++ comiler सिंटैक्स का उपयोग अपने "शून्य" मूल्य के लिए किसी भी पॉड प्रकार प्रारंभ कर सकते हैं:

int i = int(); 
float f = float(); 
MyStruct mys = MyStruct(); 
// and generally: 
T t = T(); 

आप डिबगिंग कि कुछ और है के बारे में बात करना चाहते हैं ...

(वैसे , मुझे लगता है कि वीएस सभी अनियमित स्मृति 0xCC में शुरू हुई थी जब "डीबग मोड में, ताकि कोई फर्क नहीं पड़ता कि आप कहाँ कूदते हैं (उदाहरण के लिए एक बुरे फ़ंक्शन पॉइंटर को कॉल करें) जो कि वास्तविक प्रोग्राम कोड/डेटा int3 नहीं होता है।)

+4

या, जो लोग सी ++ को लिस्प की तरह दिखाना चाहते हैं, उनके लिए 'टी टी ((टी())) ':-) –

+1

@ जेम्स: आप बिल्कुल सही हैं, लेकिन यह वाक्यविन्यास मुझे एक दुविधा में डालता है। मुझे नहीं पता कि इससे और अधिक दर्द होता है - मेरी आंखें या मेरा दिल। :) – conio

+0

हां, यह * प्रारंभ कर सकता है, लेकिन ऐसा नहीं हुआ, इसलिए मुझे लगता है कि मैं वास्तव में डीबगिंग सहायता की ओर झुका हुआ हूं। समाधान की तरह लगता है g ++ के बाहर है, हालांकि (valgrind et.al)। –

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