2016-03-01 12 views
12

मान लें कि आप जानते हैं कि आपका सॉफ़्टवेयर केवल दो पूरक मशीनों पर चलता है जहां हस्ताक्षर किए गए अतिप्रवाह व्यवहार को अच्छी तरह से परिभाषित किया जाता है। हस्ताक्षर किए गए अतिप्रवाह अभी भी सी और सी ++ में अपरिभाषित व्यवहार है और संकलक आपके पूरे कार्यक्रम को "सेवानिवृत्त" के साथ बदलने के लिए स्वतंत्र है, परमाणु युद्ध शुरू करें, अपने ड्राइव को प्रारूपित करें, या राक्षसों को अपनी नाक से बाहर निकालें।क्या अनिर्धारित व्यवहार एएसएम कोड पर लागू होता है?

मान लीजिए कि आपने इनलाइन एएसएम में ओवरफ़्लो पर हस्ताक्षर किए हैं, क्या आपका प्रोग्राम अभी भी यूबी का आह्वान करता है?

यदि हां, अलग से संकलित और जुड़े असेंबलर के बारे में क्या?

+0

यह एक बहुत ही रोचक सवाल है। मैं भी जानना चाहता हूं। – callyalater

+5

क्या इनलाइन एएसएम मानक सी या सी ++ पहले स्थान पर है? मैं ईमानदारी से नहीं जानता। यदि नहीं, तो पूरा सवाल मुझे लगता है कि चमकदार जमीन पर खड़ा है। –

+2

वैसे भी [dcl.asm] है: * 'asm' घोषणा सशर्त रूप से समर्थित है; इसका अर्थ कार्यान्वयन-परिभाषित है। * – NathanOliver

उत्तर

8

"अपरिभाषित व्यवहार" का मतलब सी resp। सी ++ मानक आपके प्रोग्राम के व्यवहार को परिभाषित नहीं करते हैं। यदि आपके प्रोग्राम में इनलाइन असेंबली है, तो यह स्पष्ट होना चाहिए कि इसका व्यवहार आमतौर पर सी या सी ++ मानक द्वारा वर्णित नहीं किया जाएगा। कुछ अन्य मानक भी व्यवहार को परिभाषित कर सकते हैं, लेकिन सी या सी ++ मानक के संदर्भ में इसका अभी भी "परिभाषित व्यवहार" नहीं है।

उस ने कहा, सी मानक को समर्थित एक्सटेंशन के दस्तावेज़ की आवश्यकता होती है।

4. अनुरूपता

: अपने कार्यक्रम के व्यवहार अपने कार्यान्वयन के दस्तावेज़ से अनुमान लगाया जा सकता है, तो और अपने कार्यान्वयन अपने कार्यक्रम अलग तरह से व्यवहार करता है, कि अपने कार्यान्वयन की विफलता मानक के अनुरूप करने के लिए है

8 एक कार्यान्वयन एक दस्तावेज़ के साथ होगा जो सभी कार्यान्वयन-परिभाषित और लोकेल-विशिष्ट विशेषताओं और सभी एक्सटेंशन को परिभाषित करता है।

सी ++ के लिए, इस आवश्यकता को कमजोर कर दिया गया है

1,4 कार्यान्वयन अनुपालन [intro.compliance]

9 प्रत्येक कार्यान्वयन प्रलेखन है कि यह है कि सभी को सशर्त समर्थन निर्माणों की पहचान करता है में शामिल होगा सभी लोकेल-विशिष्ट विशेषताओं का समर्थन और परिभाषित नहीं करता है।

और

1,9 कार्यक्रम निष्पादन [intro.execution]

2 कुछ पहलुओं और अमूर्त मशीन के संचालन के रूप में इस अंतर्राष्ट्रीय मानक में वर्णित हैं कार्यान्वयन से परिभाषित [... ] प्रत्येक कार्यान्वयन में इन विशेषताओं में अपनी विशेषताओं और व्यवहार का वर्णन करने वाले दस्तावेज शामिल होंगे। [...]

मैं दस्तावेजों को दस्तावेज करने के लिए एक आवश्यकता नहीं ढूंढ पा रहा हूं, और यदि दस्तावेज़ित किया गया है, तो सही तरीके से दस्तावेज किया जाना चाहिए। यह सुझाव देगा कि सी ++ में, भले ही आपका कार्यान्वयन आपके कार्यक्रम के व्यवहार को विस्तार के रूप में परिभाषित करता है, अगर यह पता चला कि दस्तावेज गलत है, तो यह बहुत बुरा है।

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

+0

ठीक है, इसलिए मानक के अनुसार यह कार्यान्वयन परिभाषित किया गया है कि प्रोग्राम के लिए इनलाइन एएसएम का अर्थ क्या है। यह सवाल तब पूछता है, वास्तव में लोकप्रिय कंपाइलर क्या करते हैं? – Eloff

+0

@ एलोफ यह आपने जो पूछा है उससे बहुत अलग सवाल है और यहां जवाब देने के लिए बहुत कुछ लेता है। – hvd

3

जैसे ही आप कहते हैं कि आपने इनलाइन एएसएम में ओवरफ़्लो पर हस्ताक्षर किए हैं, इसका मतलब है कि आप कण्युलर कंपाइलर (या कंपाइलर का एक सेट) के बारे में बात कर रहे हैं क्योंकि सी में सी ++ में एएसएम घोषणा के लिए समर्थन और इसका अर्थ है कंपाइलर परिभाषित किया गया।

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

असेंबली मॉड्यूल और सी और/या सी ++ कोड का अलग संकलन कंपेलरों और मशीनों के उस सेट के लिए समान होगा: परिणाम कार्यान्वयन परिभाषित किया गया है जो यूबी जैसा नहीं है।

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

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