C ++ कोर दिशानिर्देशों में नियम ES.20 है: हमेशा किसी ऑब्जेक्ट को इनिशियलाइज़ करें ।
प्रयुक्त-पहले-सेट त्रुटियों और उनके संबंधित अपरिभाषित व्यवहार से बचें। जटिल आरंभीकरण की समझ के साथ समस्याओं से बचें। रीफैक्टरिंग को सरल बनाएं।
लेकिन यह नियम बग खोजने में मदद नहीं करता है, यह केवल उन्हें छुपाता है।
मान लीजिए कि एक प्रोग्राम में एक निष्पादन पथ है जहां यह एक असिंचित चर का उपयोग करता है। यह एक बग है। एक तरफ का अपरिभाषित व्यवहार, इसका मतलब यह भी है कि कुछ गलत हो गया है, और कार्यक्रम शायद इसकी उत्पाद आवश्यकताओं को पूरा नहीं करता है। जब इसे उत्पादन के लिए तैनात किया जाएगा, तो धन हानि हो सकती है, या इससे भी बदतर हो सकती है।
हम कीड़े कैसे स्क्रीन करते हैं? हम परीक्षण लिखते हैं। लेकिन परीक्षण निष्पादन पथ के 100% को कवर नहीं करते हैं, और परीक्षण कभी भी प्रोग्राम इनपुट के 100% को कवर नहीं करते हैं। इससे भी अधिक, यहां तक कि एक परीक्षण एक दोषपूर्ण निष्पादन पथ को कवर करता है - यह अभी भी गुजर सकता है। यह अपरिभाषित व्यवहार है सब के बाद, एक uninitialized चर कुछ मान मान्य हो सकता है।
लेकिन हमारे परीक्षणों के अलावा, हमारे पास कंपाइलर हैं जो 0xCDCDCDCD जैसे कुछ को अनइंस्टाल्यूटेड वैरिएबल में लिख सकते हैं। यह परीक्षणों की पहचान दर में थोड़ा सुधार करता है।
इससे भी बेहतर - एड्रेस सेनिटाइज़र जैसे उपकरण हैं, जो असमान मेमोरी बाइट्स के सभी रीड को पकड़ लेंगे।
और अंत में स्थिर विश्लेषक हैं, जो कार्यक्रम को देख सकते हैं और बता सकते हैं कि उस निष्पादन पथ पर एक रीड-पहले-सेट है।
इसलिए हमारे पास कई शक्तिशाली उपकरण हैं, लेकिन अगर हम वैरिएबल को इनिशियलाइज़ करते हैं - सैनिटाइज़र को कुछ नहीं मिलता है ।
int bytes_read = 0;
my_read(buffer, &bytes_read); // err_t my_read(buffer_t, int*);
// bytes_read is not changed on read error.
// It's a bug of "my_read", but detection is suppressed by initialization.
buffer.shrink(bytes_read); // Uninitialized bytes_read could be detected here.
// Another bug: use empty buffer after read error.
use(buffer);
एक और नियम है - यदि प्रोग्राम निष्पादन बग का सामना करता है, तो प्रोग्राम को जल्द से जल्द मर जाना चाहिए। इसे जिंदा रखने की जरूरत नहीं है, बस दुर्घटनाग्रस्त हो जाए, क्रैश क्रैश लिख दें, इसे जांच के लिए इंजीनियरों को दें।
आरंभिक चर को अनावश्यक रूप से विपरीत करता है - कार्यक्रम को जीवित रखा जा रहा है, जब यह पहले से ही एक विभाजन दोष प्राप्त करेगा।
\0
छोटी गाड़ी है। यदि यह उस से निपटने के लिए नहीं प्रलेखित है, तो आपका कॉलिंग कोड छोटी गाड़ी है। यदि आप कॉल करने bytes_read==0
से पहले जांचने के लिए अपना कॉलिंग कोड ठीक कर लेते हैं, तो आप वापस उसी स्थान पर पहुंच गए हैं जहां से आपने शुरू किया था: यदि आप शुरू नहीं करते हैं तो आपका कोड छोटी गाड़ी bytes_read
है। ( आमतौर पर फ़ंक्शंस किसी त्रुटि के मामले में भी उनके आउट-मापदंडों को भरने के लिए किए जाते हैं : वास्तव में नहीं। बहुत बार आउटपुट या तो अकेले या अपरिभाषित रह जाते हैं।)
err_t
लौटाया गया है my_read()
? यदि उदाहरण में कहीं भी बग है, तो यह है।
bytes_read
परिवर्तित नहीं होती है (इसलिए शून्य रखी जाती है), तो इसे बग क्यों माना जाता है? यह कार्यक्रम तब भी जारी रह सकता है जब तक कि यह स्पष्ट रूप से अपेक्षित नहीं हैbytes_read!=0
। तो यह ठीक है शिकायतकर्ताओं शिकायत नहीं है। दूसरी ओर, जबbytes_read
पहले से प्रारंभ नहीं किया गया है, कार्यक्रम नहीं एक समझदार तरीके से जारी रखने के लिए सक्षम हो जाएगा, तो आरंभ नहींbytes_read
वास्तव में परिचय एक बग जो वहाँ पहले से नहीं था।