2011-04-04 17 views
7

अगर मैं कार्य करें:const_cast <> का उपयोग करते समय अपरिभाषित व्यवहार कहां है?

const char* const_str = "Some string"; 

char* str = const_cast<char*>(const_str); // (1) 

str[0] = "P"; // (2) 

कहाँ (जो लाइन) वास्तव में अपरिभाषित व्यवहार है?

मैं इस पर बहुत कुछ खोज रहा हूं लेकिन मुझे कोई स्पष्ट और सटीक उत्तर नहीं मिला है (या कम से कम, कोई भी जिसे मैं समझ सकता हूं)।

भी संबंधित हैं:

// The documentation states that str will never be modified, just read. 
void read_string(char* str); 

यह ठीक है की तरह कुछ लिखने के लिए:

std::string str = "My string"; 

read_string(const_cast<char*>(str.c_str())); 

जब से मैं निश्चित रूप से पता है कि read_string() होगा अगर मैं एक बाहरी पुस्तकालय जो समारोह के इस प्रकार प्रदान करता है का उपयोग करें कभीstr पर लिखने का प्रयास करें?

धन्यवाद।

उत्तर

9

रेखा (2) ने व्यवहार को अपरिभाषित किया है। कंपाइलर को केवल पढ़ने योग्य स्मृति में स्थिरांक रखने की स्वतंत्रता है (एक बार विंडोज़ में एक बार यह "डेटा सेगमेंट" होता) इसलिए लिखने से आपके प्रोग्राम को समाप्त हो सकता है। या यह नहीं हो सकता है।

खराब परिभाषित लाइब्रेरी फ़ंक्शन (गैर-कॉन्स्ट पैरामीटर जो कॉन्स्ट होना चाहिए) को कॉल करते समय कॉन्स्ट-नेस को दूर करना है, हां, असामान्य नहीं है। ऐसा करो, लेकिन अपनी नाक पकड़ो।

+6

"ऐसा करें, लेकिन अपनी नाक पकड़ो।" एक बार रैपर फ़ंक्शन में इसे करने पर विचार करें, इसलिए सभी वितरित कॉल साइट कम से कम उस कुरूपता से बच सकते हैं। –

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। क्या आपके पास अपने अंतिम दावे को मजबूत करने के लिए कोई स्रोत है? मैं ओपनएसएसएल के आसपास एक सी ++ रैपर डिजाइन कर रहा हूं (जो दुर्भाग्य से गंभीर इंटरफ़ेस असंगतताओं से ग्रस्त है) और मैं यह सुनिश्चित करना चाहता हूं कि मेरा कोड अपरिभाषित व्यवहार का कारण नहीं होगा। – ereOn

+2

सी ++ मानक धारा 5.2.11 # 7 इंगित करता है कि एक * लेखन ऑपरेशन * अपरिभाषित व्यवहार में परिणाम। इस प्रकार ऑपरेशन को सुरक्षित रखना चाहिए। –

-1

आप एक स्थिर स्ट्रिंग को संशोधित करने का प्रयास कर रहे हैं जो संकलक प्रक्रिया के केवल-पढ़ने वाले खंड में डाल सकता है। यह बेहतर है:

char str[32]; 
strcpy(str, "Some string"); 
str[0] = "P"; 
+0

कोई अपराध नहीं है, लेकिन यह मेरे प्रश्न का बिल्कुल जवाब नहीं देता है: मुझे पता है कि यह बुरा है, और यदि मेरा इरादा स्ट्रिंग को संशोधित करना है, तो मैं इसे पहले स्थान पर 'कॉन्स्ट' घोषित नहीं करूंगा। असली सवाल यह है कि: "क्या मुझे वास्तव में खराब स्ट्रिंग इंटरफ़ेस के साथ इसका उपयोग करने के लिए अपनी स्ट्रिंग को प्रतिलिपि बनाना है या कलाकार स्वीकार्य है?" – ereOn

+0

जैसा कि रॉब ने इंगित किया है - यह लाइन (2) पर है - वह रेखा जहां आप बफर को संशोधित करते हैं जो संभावित रूप से केवल पढ़ने योग्य स्मृति में है। – trojanfoe

+1

@ereOn: तथ्य यह है कि सी ++ आपको 'char * x = "abc" 'लिखने की अनुमति देता है, और इसलिए बिना किसी अपरिभाषित व्यवहार के पुराने कोड को संकलित और चलाने में सक्षम है, यह सबूत है कि जब तक कोई लेखन वास्तव में प्रयास नहीं किया जाता है तब तक कोई अपरिभाषित व्यवहार नहीं होता है । –