अपरिभाषित व्यवहार तब टकराता है जब कार्यक्रम अपरिभाषित व्यवहार का कारण बनेगा चाहे जो भी हो। हालाँकि, आपने निम्न उदाहरण दिया।
int num = ReadNumberFromConsole();
if (num == 3) {
PrintToConsole(num);
*((char*)NULL) = 0;
}
जब तक कंपाइलर की परिभाषा PrintToConsole
नहीं पता है , यह if (num == 3)
सशर्त नहीं निकाल सकता है। मान लेते हैं कि आपके पास LongAndCamelCaseStdio.h
निम्नलिखित घोषणा के साथ सिस्टम हैडर है PrintToConsole
।
void PrintToConsole(int);
कुछ भी मददगार नहीं है, सब ठीक है। अब, आइए देखें कि इस फ़ंक्शन की वास्तविक परिभाषा की जांच करके विक्रेता कितना दुष्ट है (या शायद इतना बुरा नहीं है, अपरिभाषित व्यवहार अधिक बुरा हो सकता है)।
int printf(const char *, ...);
void exit(int);
void PrintToConsole(int num) {
printf("%d\n", num);
exit(0);
}
कंपाइलर को वास्तव में यह मानना पड़ता है कि किसी भी मनमाने ढंग से फंक्शन कंपाइलर को यह पता नहीं होता है कि वह क्या करता है या किसी अपवाद से बाहर निकल सकता है (C ++ के मामले में)। आप नोटिस कर सकते हैं कि *((char*)NULL) = 0;
निष्पादित नहीं किया जाएगा, क्योंकि PrintToConsole
कॉल के बाद निष्पादन जारी नहीं रहेगा ।
अपरिभाषित व्यवहार PrintToConsole
वास्तव में लौटने पर हमला करता है। संकलक को उम्मीद है कि ऐसा नहीं होगा (क्योंकि इससे कार्यक्रम अपरिभाषित व्यवहार को अंजाम देने में कोई फर्क नहीं पड़ेगा), इसलिए कुछ भी हो सकता है।
हालांकि, चलो कुछ और पर विचार करें। मान लें कि हम अशक्त जाँच कर रहे हैं, और अशक्त जाँच के बाद चर का उपयोग करें।
int putchar(int);
const char *warning;
void lol_null_check(const char *pointer) {
if (!pointer) {
warning = "pointer is null";
}
putchar(*pointer);
}
इस मामले में, यह नोटिस करना आसान है कि lol_null_check
एक गैर-पूर्ण सूचक की आवश्यकता है। वैश्विक गैर-वाष्पशील warning
चर को असाइन करना कुछ ऐसा नहीं है जो कार्यक्रम से बाहर निकल सकता है या किसी अपवाद को फेंक सकता है। यह pointer
भी गैर-वाष्पशील है, इसलिए यह फ़ंक्शन के बीच में जादुई रूप से इसके मूल्य को नहीं बदल सकता है (यदि ऐसा होता है, तो यह अपरिभाषित व्यवहार है)। कॉलिंग lol_null_check(NULL)
अपरिभाषित व्यवहार का कारण बनेगी जिसके कारण चर को असाइन नहीं किया जा सकता (क्योंकि इस बिंदु पर, तथ्य यह है कि कार्यक्रम अपरिभाषित व्यवहार को निष्पादित करता है)।
हालांकि, अपरिभाषित व्यवहार का मतलब कार्यक्रम कुछ भी कर सकता है। इसलिए, कुछ भी अपरिभाषित व्यवहार को समय में वापस जाने से नहीं रोकता है, और निष्पादन की पहली पंक्ति से पहले आपके प्रोग्राम को क्रैश कर रहा है int main()
। यह अपरिभाषित व्यवहार है, इसका कोई मतलब नहीं है। यह टाइपिंग 3 के बाद भी दुर्घटनाग्रस्त हो सकता है, लेकिन अपरिभाषित व्यवहार समय में वापस चला जाएगा, और इससे पहले कि आप भी टाइप करें 3. दुर्घटना और जो जानता है, शायद अपरिभाषित व्यवहार आपके सिस्टम रैम को अधिलेखित कर देगा, और आपके सिस्टम को 2 सप्ताह बाद क्रैश करने का कारण होगा, जबकि आपका अपरिभाषित कार्यक्रम नहीं चल रहा है।