10

इन दोनों कार्यों पर विचार करें:क्या एक अन्य सरणी में एक चार सरणी कास्टिंग सख्त-एलियासिंग नियमों का उल्लंघन करता है?

int f1() 
{ 
    alignas(int) char buf[sizeof(int)] = {}; 
    return *reinterpret_cast<int*>(buf); 
} 

int f2() 
{ 
    alignas(int) char buf[sizeof(int)] = {}; 
    char* ptr = buf; 
    return *reinterpret_cast<int*>(ptr); 
} 

जीसीसी चेतावनी दी है कि पहले सख्त अलियासिंग के नियमों का उल्लंघन। लेकिन दूसरा ठीक है।

क्लैंग दोनों शिकायत के बिना स्वीकार करता है।

क्या चेतावनी वैध है?

+0

हां। यहां "ऑब्जेक्ट" या तो 'char' या' char' की सरणी है और glvalue प्रकार 'int' है; https://timsong-cpp.github.io/cppwp/basic.lval#8 में कुछ भी इस मामले को शामिल नहीं करता है। –

उत्तर

8

चेतावनी वैध है। f2 ठीक नहीं है (यह अपरिभाषित व्यवहार है), यह चेतावनी को उत्तेजित नहीं करता है।

मुझे लगता है कारण यह है कि f2 चेतावनी भड़काने नहीं करता है:

int f3() 
{ 
    int i = 0; 
    char *ptr = reinterpret_cast<char*>(&i); 
    return *reinterpret_cast<int*>(ptr); 
} 

पूरी तरह कानूनी है। आप "सार्वभौमिक सूचक" के रूप में char* (या void*) का उपयोग कर सकते हैं - बशर्ते आप पहुंच से पहले सही प्रकार पर वापस आएं। f2 के बारे में चेतावनी देने की लागत पर f3 के बारे में चेतावनी से बचने के लिए जीसीसी स्पष्ट रूप से सावधान रह रहा है।

क्लैंग f1 या f2 के बारे में चेतावनी देने में विफल रहा है - लेकिन इसकी आवश्यकता नहीं है।

+0

मानक उद्धरण की आवश्यकता है। –

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