वास्तव में "आईबी" और "यूबी" का क्या अर्थ है?


110

मैंने कई बार "IB" और "UB" शब्दों का उपयोग किया है, विशेष रूप से C ++ के संदर्भ में। मैंने उन्हें गुगली करने की कोशिश की है, लेकिन जाहिर तौर पर उन दो-अक्षर संयोजनों का बहुत उपयोग होता है। : पी

इसलिए, मैं आपसे पूछता हूं ... उनका क्या मतलब है, जब वे कहते हैं जैसे कि वे एक बुरी चीज हैं?


5
यदि आप किसी और के संपादन को वापस करने का निर्णय लेते हैं, तो कृपया सुनिश्चित करें कि आपकी वर्तनी, विराम चिह्न और व्याकरण सही हैं। मूल पाठ पर पर्याप्त सुधार करने वाले संपादन वापस करना व्यर्थ है।
रॉबर्ट हार्वे

जवाबों:


139

आईबी: कार्यान्वयन-परिभाषित व्यवहार। मानक सटीक व्यवहार को परिभाषित करने के लिए इसे विशेष संकलक / मंच तक छोड़ देता है, लेकिन इसके लिए इसे परिभाषित करने की आवश्यकता होती है।

कार्यान्वयन-परिभाषित व्यवहार का उपयोग करना उपयोगी हो सकता है, लेकिन आपके कोड को कम पोर्टेबल बनाता है।

यूबी: अपरिभाषित व्यवहार। मानक निर्दिष्ट नहीं करता है कि अपरिभाषित व्यवहार को लागू करने वाले प्रोग्राम को कैसे व्यवहार करना चाहिए। "नाक राक्षसों" के रूप में भी जाना जाता है क्योंकि सैद्धांतिक रूप से यह राक्षसों को आपकी नाक से बाहर उड़ सकता है।

अपरिभाषित व्यवहार का उपयोग करना लगभग हमेशा एक बुरा विचार है। यहां तक ​​कि अगर यह कभी-कभी काम करने लगता है, तो पर्यावरण, संकलक या प्लेटफ़ॉर्म में कोई भी परिवर्तन आपके कोड को बेतरतीब ढंग से तोड़ सकता है।


11
मैं अभी भी C ++ में अपरिभाषित व्यवहार का उपयोग करने के कारण किसी के नाक से बाहर उड़ने वाले दानव की प्रतीक्षा कर रहा हूं। मुझे लगता है कि यह तब होगा जब पहले संकलक नए सी ++ मानक का पूरी तरह से पालन करते हैं।
ओरेगॉनहोस्ट

4
@OregonGhost: मुझे लगता है कि आप सही हैं। मैंने देखा है कि यह एक दो बार यूनिकॉर्न के साथ होता है, लेकिन कभी दानव नहीं।
थॉमस

33
@OregonGhost - मानक निर्दिष्ट नहीं करता है कि एक दानव के पास कितने सींग होने चाहिए।
DVK

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

1
यह मजेदार है कि कैसे किसी ने इस सवाल का जवाब नहीं दिया 30k से कम प्रतिष्ठा है।

19

कार्यान्वयन-परिभाषित व्यवहार और अपरिभाषित व्यवहार

C ++ मानक विभिन्न निर्माणों के प्रभावों के बारे में बहुत विशिष्ट है, और विशेष रूप से आपको हमेशा इन श्रेणियों की परेशानी के बारे में पता होना चाहिए :

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

  • अनिर्दिष्ट व्यवहार का मतलब है कि कार्यक्रम को कुछ समझदार और सुसंगत करना चाहिए, लेकिन इसे दस्तावेज़ करने की आवश्यकता नहीं है ।

  • कार्यान्वयन-परिभाषित व्यवहार अनिर्दिष्ट के समान है, लेकिन संकलक लेखकों द्वारा भी प्रलेखित किया जाना चाहिए। इसका एक उदाहरण है reinterpret_castआमतौर पर , यह पते को संशोधित किए बिना, केवल एक पॉइंटर के प्रकार को बदलता है, लेकिन मैपिंग वास्तव में कार्यान्वयन-परिभाषित है, इसलिए एक कंपाइलर पूरी तरह से अलग पते पर मैप कर सकता है , जब तक कि यह इस विकल्प को दस्तावेजित करता है। एक और उदाहरण एक इंट का आकार है। C ++ मानक की परवाह नहीं है अगर यह 2, 4 या 8 बाइट्स है, लेकिन इसे कंपाइलर द्वारा प्रलेखित किया जाना चाहिए

लेकिन इन सभी के लिए आम बात यह है कि वे सबसे अधिक परहेज करते हैं। जब संभव हो, तो ऐसे व्यवहार के साथ रहें जो C ++ मानक द्वारा निर्दिष्ट 100% है। इस तरह, आप पोर्टेबिलिटी की गारंटी दे रहे हैं।

आपको अक्सर कुछ कार्यान्वयन-परिभाषित व्यवहार पर भी भरोसा करना होगा। यह अपरिहार्य हो सकता है, लेकिन आपको अभी भी इस पर ध्यान देना चाहिए, और ध्यान रखें कि आप किसी ऐसी चीज़ पर भरोसा कर रहे हैं जो विभिन्न कंपाइलरों के बीच बदल सकती है।

दूसरी ओर, अपरिभाषित व्यवहार को हमेशा टाला जाना चाहिए। सामान्य तौर पर, आपको बस यह मान लेना चाहिए कि यह आपके प्रोग्राम को एक या दूसरे तरीके से विस्फोट कर देता है।


1
अगर आपको पोर्टेबिलिटी की परवाह है तो यूबी से बचना चाहिए । एक विशेष कार्यान्वयन यह परिभाषित कर सकता है कि विशिष्ट अपरिभाषित व्यवहार के लिए क्या होता है, और कुछ मामलों में (विशेष रूप से डिवाइस ड्राइवर और छोटे एम्बेडेड सिस्टम) आपको उन चीजों का उपयोग करने की आवश्यकता होती है।
जेरी कॉफिन

3
@ जेरी: नहीं, यूबी से बचा जाना चाहिए अगर यह पूरी तरह से अपरिभाषित है । यदि प्लेटफ़ॉर्म / कार्यान्वयन / रनटाइम / कंपाइलर आगे की गारंटी देता है, तो आप व्यवहार पर भरोसा कर सकते हैं और पोर्टेबिलिटी खो सकते हैं। लेकिन तब यह अपरिभाषित के रूप में नहीं रह गया है ... ज्यादातर समय, हालांकि, आपके पास ऐसी कोई गारंटी नहीं है, और अपरिभाषित सिर्फ अपरिभाषित है, और हर कीमत पर बचा जाना चाहिए।
४:५०

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

"अब नहीं के रूप में अपरिभाषित" - यह बिल्कुल मानक द्वारा अपरिभाषित है , और यूबी मानक द्वारा अपरिभाषित एक छोटा हाथ है। आपके उदाहरण में इसे कार्यान्वयन द्वारा परिभाषित किया गया है। उस मामले के लिए आप उस व्यवहार पर भरोसा कर सकते हैं जो मानक या कार्यान्वयन द्वारा परिभाषित नहीं है , यदि आपने ऑब्जेक्ट कोड की जांच की है और फिर से दोबारा खोलने की योजना नहीं है; तो फिर
स्टीव जेसप

"उसके बाद खुद के बराबर तुलना करनी चाहिए"। हम्म, जब तक कि यह एक NaN नहीं है। वैसे भी, इसके प्रकार के लिए जो भी व्यवहार आवश्यक है, वह होना चाहिए।
स्टीव जेसोप

8
  • IB: कार्यान्वयन परिभाषित व्यवहार है - संकलक को यह दस्तावेज़ करना चाहिए कि वह क्या करता है। >>एक नकारात्मक मूल्य पर एक ऑपरेशन करना एक उदाहरण है।

  • यूबी: अपरिभाषित व्यवहार - कंपाइलर कभी भी कर सकता है, जिसमें बस दुर्घटनाग्रस्त होना या अप्रत्याशित परिणाम देना शामिल है। अशक्त सूचक को श्रेणीबद्ध करना इस श्रेणी में आता है, लेकिन सूचक अंकगणित जैसी चीजों को भी घटाता है जो किसी सरणी वस्तु की सीमा के बाहर आता है।

एक अन्य संबंधित शब्द 'अनिर्दिष्ट व्यवहार' है। यह कार्यान्वयन परिभाषित और अपरिभाषित व्यवहारों के बीच का प्रकार है। अनिर्दिष्ट व्यवहार के लिए, कंपाइलर को मानक के अनुसार कुछ करना चाहिए, लेकिन वास्तव में जो मानक देता है वह कंपाइलर पर निर्भर करता है और इसे परिभाषित नहीं किया जाना चाहिए (या सुसंगत भी नहीं)। उप-अभिव्यक्तियों के मूल्यांकन के क्रम जैसी चीजें इस श्रेणी में आती हैं। संकलक जो कुछ भी इसे पसंद करता है, उसे क्रम में कर सकता है, और इसे अलग-अलग बिल्ड में अलग-अलग तरीके से कर सकता है या एक ही बिल्ड के अलग-अलग रनों में भी (अप्रभावित, लेकिन अनुमत)।


4

लघु संस्करण:

कार्यान्वयन-परिभाषित व्यवहार (आईबी): सही ढंग से क्रमबद्ध लेकिन अनिश्चित *

अपरिभाषित व्यवहार (UB): गलत तरीके से क्रमादेशित (यानी एक बग !)

*) "अनिश्चितता" जहां तक ​​भाषा मानक का संबंध है, यह निश्चित रूप से किसी भी निश्चित मंच पर निर्धारित किया जाएगा।


यदि मानक इंगित करता है कि एक कार्रवाई कार्यान्वयन-परिभाषित व्यवहार को लागू करती है, तो उस कार्रवाई के परिणामस्वरूप एक सुसंगत व्यवहार को निर्दिष्ट करने के लिए कार्यान्वयन की आवश्यकता होती है । दुर्भाग्य से, व्यवहार की कोई श्रेणी नहीं है जिसके लिए संभावित परिणामों को निर्दिष्ट करने के लिए एक कार्यान्वयन की आवश्यकता होगी, लेकिन किसी विशेष परिणाम के लगातार होने की आवश्यकता नहीं होगी।
सुपरकैट

4

तो आईबी है ... एकीकृत बैरोमीटर? : P
FrustratedWithFormsDesigner

@ स्वीकृत: आईबी के बारे में निश्चित नहीं था। इसके लिए गूगल को था। : पी
लापताफैक्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.