2012-02-09 13 views
8

this reddit comment thread के अनुसार, यह अगर एक प्रयास से पहले यह करने के लिए लिखा गया है स्मृति को पढ़ने के लिए किया जाता है अनिर्धारित रहता है। मैं सामान्य ढेर स्मृति जो सफलतापूर्वक malloc एड किया गया है की चर्चा करते हुए कर रहा हूँ।पढ़ा है?

... ध्यान दें कि इस सख्ती से वैध सी नहीं है: संकलक/क्रम प्रणाली जाल अभ्यावेदन, जो उपयोग पर अपरिभाषित व्यवहार का कारण तथाकथित साथ अप्रारंभीकृत स्मृति प्रारंभ करने की अनुमति है।

मैं इस पर विश्वास करना मुश्किल लगता है। क्या कोई मानक उद्धरण है?

बेशक

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

+0

एर्म, क्या आप अपरिभाषित व्यवहार का मतलब है लगता है? (हाँ, आबंटित स्मृति उपयोग करने से पहले यह शुरू कर दिया गया अपरिभाषित व्यवहार का उत्पादन) –

+1

@Brian मैं वह है कि क्या पूरे व्यवहार (यानी होगा इस segfault) पूछ रहा है मान अपरिभाषित है, या बस मूल्य कि पढ़ने से परिणाम होता है। – Owen

+0

@ ओवेन, यह सही है, मैंने तदनुसार प्रश्न अपडेट किया है। –

उत्तर

10

यदि char* के माध्यम से पहुंच रहा है, तो यह परिभाषित किया गया है। लेकिन अन्यथा, यह अपरिभाषित व्यवहार है।

(सी 99, 7.20.3.3) "मॉलोक फ़ंक्शन किसी ऑब्जेक्ट के लिए स्थान आवंटित करता है जिसका आकार आकार के अनुसार निर्दिष्ट होता है और जिसका मान अनिश्चित है।"

(C99, 3.17.2p1):

अनिश्चित मूल्य पर

"अनिश्चित मूल्य: या तो एक अनिर्दिष्ट मूल्य या एक जाल प्रतिनिधित्व"

जाल प्रतिनिधित्व पर एक गैर के माध्यम से पढ़ने -character टाइप अपरिभाषित व्यवहार प्रकार:

(सी 99, 6.2.6।1p5) "कुछ वस्तु अभ्यावेदन ऑब्जेक्ट प्रकार के एक मूल्य का प्रतिनिधित्व जरूरत नहीं है। एक वस्तु की संग्रहीत मूल्य इस तरह के एक प्रतिनिधित्व है और एक lvalue अभिव्यक्ति है कि चरित्र प्रकार नहीं है द्वारा पढ़ा जाता है, तो व्यवहार अनिर्धारित रहता है। [... ] इस तरह के एक प्रतिनिधित्व को जाल प्रतिनिधित्व कहा जाता है। "

+1

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

+0

@ ब्रूक्समोस ने – ouah

+0

@ ब्रुक्समोस किया, यह एक बड़ा सवाल है। "जाल प्रतिनिधित्व" का क्या अर्थ है? –

1

ISO/IEC 9899:1999, 7.20.3.3 malloc समारोह:

malloc समारोह एक वस्तु जिसका आकार आकार और जिसका मान अनिश्चित है द्वारा निर्दिष्ट किया जाता के लिए जगह आवंटित करता है।

6.2.6.1 प्रकार का प्रतिनिधित्व, §5:

कुछ वस्तु अभ्यावेदन ऑब्जेक्ट प्रकार के एक मूल्य का प्रतिनिधित्व जरूरत नहीं है। यदि संग्रहित किसी ऑब्जेक्ट का मान इस तरह का प्रतिनिधित्व करता है और एक lvalue अभिव्यक्ति द्वारा पढ़ा जाता है जो में वर्ण प्रकार नहीं है, तो व्यवहार अपरिभाषित है।

और फुटनोट 41 यह (कम से कम स्वत: चर के लिए) और भी अधिक स्पष्ट करता है:

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

+0

मुझे 'अनिश्चित मूल्य' के साथ कोई समस्या नहीं है। यह जवाब में स्पष्ट है। सवाल यह है कि व्यवहार पूरी तरह से अपरिभाषित है (segfaults और इतने पर)। –

+1

तो यह 'char *' के माध्यम से ठीक है? क्या आप ऐसी वस्तु का उदाहरण दे सकते हैं? मैं यह याद रखने की कोशिश कर रहा हूं कि 'डबल' का प्रतिनिधित्व कैसे किया जाता है - शायद सभी बिट-कॉन्फ़िगरेशन मान्य 'डबल' पर नहीं। क्या यह ऐसी चीज है जिसे यहां संदर्भित किया जा रहा है? –

+1

'NaN' (" संख्या नहीं ") मानों के विभिन्न प्रकार हैं जो' डबल' मानक प्रतिनिधित्व का हिस्सा हैं, लेकिन वे अभी भी "मान्य" हैं। –

2

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

मानक पढ़ना, मुख्य प्रश्न यह है कि क्या malloced स्मृति के मान "अनिर्दिष्ट मान" (जो कुछ पठनीय मूल्य होना चाहिए), या "अनिश्चित मान" होना चाहिए (जिसमें जाल प्रतिनिधित्व हो सकता है; सीएफ परिभाषा 3.17। 2.)

प्रति 7.20.3.3, अन्य उत्तर में उद्धृत के रूप में, malloc जो अनिश्चित मान हैं, और इसलिए जाल अभ्यावेदन हो सकती है स्मृति का एक ब्लॉक देता है। जाल प्रतिनिधित्वों की प्रासंगिक चर्चा 6.2.6.1 है, भाग 5:

कुछ ऑब्जेक्ट प्रस्तुतियों को ऑब्जेक्ट प्रकार के मान का प्रतिनिधित्व करने की आवश्यकता नहीं है। यदि किसी ऑब्जेक्ट के संग्रहीत मूल्य में ऐसा प्रतिनिधित्व होता है और इसे एक लेल्यू अभिव्यक्ति द्वारा पढ़ा जाता है जिसमें वर्ण प्रकार नहीं होता है, तो व्यवहार अपरिभाषित होता है। ... इस तरह के एक प्रतिनिधित्व को जाल प्रतिनिधित्व कहा जाता है।

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

+0

यह क्यों जरूरी है कि वालग्रिंड जैसे टूल्स पूरी तरह से अनुरूप सी कार्यान्वयन के रूप में व्यवहार करते हैं? मैं सुझाव दूंगा कि कई मामलों में यह उन चीजों पर जाल के लिए कॉन्फ़िगर करने योग्य होगा जो मानक द्वारा पूरी तरह से परिभाषित किए जाते हैं, लेकिन प्रोग्रामर जानता है कि दुर्घटना के अलावा कभी नहीं होगा। – supercat

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