स्पष्टीकरण: मेरा प्रश्न है:क्या यह यूबी को दूर करने और मूल्य पढ़ने के लिए है?
- यह यूबी प्रभावी प्रकार
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) नहीं हैं।
दूसरा बुलेट बिंदु: int
const 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
के माध्यम से पढ़ने के रूप में सख्त अलियासिंग शासन के साथ ठीक उसी बातचीत है करता है पहले उदाहरण में।
आपको एक वैरिएबल को अन-कॉन्स्ट करने की आवश्यकता क्यों है जिसे आपने केवल पढ़ा है? – StenSoft
@StenSoft मुझे * की आवश्यकता नहीं है लेकिन यह जानना दिलचस्प होगा कि यह यूबी है या नहीं, और यह सिद्धांत अन्य प्रश्नों में प्रासंगिक है (उदाहरण के लिए मैंने अभी जोड़ा है) –
मैं आपको निश्चित रूप से बता सकता हूं यह अभ्यास में काम नहीं कर सकता है (एक छोटे पीओडी पर कास्ट दूर कास्टिंग)। जब मैंने जीसीसी ने एक रजिस्टर में एक कॉन्स चरित्र रखा, तो मुझे गधे में थोड़ा सा मिला, और फिर मैं इसे संशोधित करने के लिए थक गया :) इसके परिणामस्वरूप 'एसजीआईबीयूएस' या 'सिगरम' (यह होने के कुछ वर्षों बाद) हुआ। अपने जोखिम पर कॉन्स-नेस के साथ मेस :) – jww