यहाँ असली जवाब है: आप वास्तव में कभी नहीं जान सकते।
कम से कम, nontrivial मामलों के लिए, आप यह सुनिश्चित नहीं कर सकते कि आपने यह सब प्राप्त कर लिया है। अगम्य कोड पर विकिपीडिया के लेख से निम्नलिखित पर विचार करें :
double x = sqrt(2);
if (x > 5)
{
doStuff();
}
विकिपीडिया सही रूप से नोट करता है, एक चतुर कंपाइलर कुछ इस तरह से पकड़ने में सक्षम हो सकता है। लेकिन एक संशोधन पर विचार करें:
int y;
cin >> y;
double x = sqrt((double)y);
if (x != 0 && x < 1)
{
doStuff();
}
क्या कंपाइलर इसे पकड़ पाएंगे? शायद। लेकिन ऐसा करने के लिए, इसे sqrt
लगातार स्केलर मान के विरुद्ध चलाने से अधिक करने की आवश्यकता होगी । यह पता लगाना (double)y
होगा कि हमेशा एक पूर्णांक (आसान) होगा, और फिर sqrt
पूर्णांक (हार्ड) के सेट के लिए गणितीय सीमा को समझेंगे । एक बहुत ही परिष्कृत कंपाइलर sqrt
फंक्शन के लिए या मैथ.एच में हर फंक्शन के लिए या किसी भी फिक्स्ड-इनपुट फंक्शन के लिए सक्षम हो सकता है , जिसका डोमेन यह पता लगा सकता है। यह बहुत, बहुत जटिल हो जाता है, और जटिलता मूल रूप से असीम है। आप अपने संकलक में परिष्कार की परतें जोड़ते रह सकते हैं, लेकिन हमेशा कुछ कोड में छलनी करने का एक तरीका होगा जो किसी भी इनपुट के सेट के लिए अगम्य होगा।
और फिर इनपुट सेट हैं जो बस कभी भी प्रवेश नहीं करते हैं। इनपुट जो वास्तविक जीवन में कोई मतलब नहीं होगा, या कहीं और सत्यापन तर्क द्वारा अवरुद्ध हो जाएगा। कंपाइलर के पास उन लोगों के बारे में जानने का कोई रास्ता नहीं है।
इसका अंतिम परिणाम यह है कि जब सॉफ्टवेयर टूल दूसरों ने उल्लेख किया है, तो वे बहुत उपयोगी हैं, आपको यह सुनिश्चित करने के लिए कभी नहीं जाना चाहिए कि आपने सब कुछ तब तक पकड़ा है जब तक आप मैन्युअल रूप से बाद में कोड के माध्यम से नहीं जाते हैं। फिर भी, आप कभी भी निश्चित नहीं होंगे कि आपने कुछ भी याद नहीं किया है।
एकमात्र वास्तविक समाधान, IMHO, जितना संभव हो उतना सतर्क रहना है, अपने निपटान में स्वचालन का उपयोग करें, रिफ्लेक्टर जहां आप कर सकते हैं, और लगातार अपने कोड को बेहतर बनाने के तरीकों की तलाश करें। बेशक, यह एक अच्छा विचार है कि वैसे भी है।