2015-02-18 4 views
6

स्पष्टीकरण: मेरा प्रश्न है:क्या यह यूबी को दूर करने और मूल्य पढ़ने के लिए है?

  • यह यूबी प्रभावी प्रकार const int की एक वस्तु का उपयोग करने के प्रकार int के lvalue उपयोग करने के लिए है?

यह सवाल जो प्रभावी प्रकार const int की एक वस्तु का उपयोग करने के प्रकार int के lvalue का उपयोग दो कोड नमूने है, और अपने इरादे को यथासंभव कम व्याकुलता के साथ इस लक्ष्य को हासिल किया जा सके। यदि इस विशिष्ट समस्या के अलावा यूबी का कोई अन्य स्रोत है तो कृपया एक टिप्पणी छोड़ दें और मैं कोड नमूना अपडेट करने का प्रयास करूंगा।


यहाँ चर्चा के लिए एक विशिष्ट कोड उदाहरण है:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    const int c = 5; 

    printf("%d\n", *(int *)&c); 
} 

कारण मैं यह हो सकता है लगता है यूबी कि सख्त अलियासिंग नियम कहना है कि यह यूबी है लगता है:

सी 11 6.5/7

किसी ऑब्जेक्ट में इसके संग्रहीत मूल्य को केवल एक्सेस किया जाएगा एक lvalue अभिव्यक्ति में से एक निम्नलिखित प्रकार है:

  • एक प्रकार वस्तु के प्रभावी प्रकार के साथ संगत,
  • एक प्रकार वस्तु के प्रभावी प्रकार के साथ संगत का एक योग्य संस्करण,
  • ...

वस्तु (6,5/6) के प्रभावी प्रकार यहाँ const int है।

पहले बुलेट बिंदु: int और const intसंगत प्रकार (6.2.7/1, 6.7.3/10) नहीं हैं।

दूसरा बुलेट बिंदु: intconst int का एक योग्य संस्करण प्रतीत नहीं होता है, क्योंकि हमने क्वालीफायर जोड़कर इसका उत्पादन नहीं किया है। हालांकि 6.2.5/26 स्पष्ट नहीं है:

प्रत्येक अयोग्य प्रकार, अपने प्रकार के कई योग्य संस्करण होते हैं एक, दो, या स्थिरांक, अस्थिर के सभी तीन, और प्रतिबंधित क्वालिफायर के संयोजन के लिए इसी। एक प्रकार के योग्य या अयोग्य संस्करण अलग-अलग प्रकार होते हैं जो एक ही प्रकार की श्रेणी से संबंधित होते हैं और समान प्रतिनिधित्व और संरेखण आवश्यकताओं के होते हैं। व्युत्पन्न प्रकार क्वालीफायर (यदि कोई है) द्वारा योग्यता प्राप्त नहीं किया जाता है, जिस प्रकार से यह व्युत्पन्न होता है।

यह एक "const int के योग्य संस्करण" होगा परिभाषित नहीं करता, यह केवल शब्द "योग्य संस्करण" जब एक अयोग्य प्रकार के लिए लागू परिभाषित करता है।


दूसरा कोड नमूना:

int *pc = malloc(sizeof *pc); 
memcpy(pc, &c, sizeof c); 
printf("%d\n", *pc); // UB? 

memcpy के बाद से, प्रभावी प्रकार (6.5/6) को बरकरार रखता है *pc के माध्यम से पढ़ने *(int *)&c के माध्यम से पढ़ने के रूप में सख्त अलियासिंग शासन के साथ ठीक उसी बातचीत है करता है पहले उदाहरण में।

+0

आपको एक वैरिएबल को अन-कॉन्स्ट करने की आवश्यकता क्यों है जिसे आपने केवल पढ़ा है? – StenSoft

+0

@StenSoft मुझे * की आवश्यकता नहीं है लेकिन यह जानना दिलचस्प होगा कि यह यूबी है या नहीं, और यह सिद्धांत अन्य प्रश्नों में प्रासंगिक है (उदाहरण के लिए मैंने अभी जोड़ा है) –

+0

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

उत्तर

2

यह नहीं है। जो आपने पाया है वह है कि इसे निहित रूप से क्यों नहीं रखा जा सकता है।

[6.2.5/26] कहा गया है:

प्रत्येक अयोग्य प्रकार, अपने प्रकार के कई योग्य संस्करण होते हैं एक, दो, या स्थिरांक के सभी तीन, अस्थिर के संयोजन के लिए इसी, और प्रतिबंधित क्वालिफायर। किसी प्रकार के योग्य या अयोग्य संस्करण अलग-अलग प्रकार हैं जो एक ही प्रकार की श्रेणी से संबंधित हैं और समान प्रतिनिधित्व और संरेखण आवश्यकताओं हैं।

(नोट:। प्रत्येक अयोग्य प्रकार const int अयोग्य नहीं है, लेकिन int अयोग्य है।)

फुटनोट के साथ

:

ही प्रतिनिधित्व और संरेखण आवश्यकताओं के रूप में परस्पर मतलब के लिए होती हैं कार्यों के लिए तर्क, कार्यों से मूल्य वापस, और संघों के सदस्यों।

इसका मतलब है कि इसे पढ़ने से वही काम मिल जाएगा और वही मूल्य मिलेगा।

[6.7.3/6] केवल संशोधन के लिए यूबी निर्दिष्ट करता है: एक प्रयास एक वस्तु गैर स्थिरांक-योग्य के साथ एक lvalue के उपयोग के माध्यम से एक स्थिरांक योग्य प्रकार से परिभाषित संशोधित करने के लिए किया जाता है

हैं प्रकार, व्यवहार अपरिभाषित है।

+0

फुटनोट गैर-मानक हैं, लेकिन किसी भी मामले में, हम कार्यों के तर्कों, कार्यों से मूल्यों को वापस करने, या संघों के सदस्यों के बारे में बात नहीं कर रहे हैं, इसलिए मुझे नहीं लगता कि यह कैसे लागू होता है या आप कैसे इससे निष्कर्ष निकालें कि पढ़ना ठीक होना चाहिए।समकक्ष प्रश्न के बारे में आप क्या सोचते हैं लेकिन 'const' के बजाय 'अस्थिर' के साथ क्या सोचते हैं? –

+0

यह वही प्रतिनिधित्व और संरेखण आवश्यकताओं है ताकि आप इसे उसी तरह पढ़ सकें। फुटनोट इसके पीछे कारण समझने के लिए उपयोगी है। अस्थिर के लिए, [6.7.3/6] निर्दिष्ट करता है कि अस्थिरता के लिए कोई गैर-अस्थिर संदर्भ यूबी है। – StenSoft

+0

6.7.3/6 में अस्थिरता के स्पष्ट निषेध के बारे में अच्छी जगह, मैंने अपने प्रश्न –

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

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