2016-06-23 9 views
6

क्या निम्न प्रोग्राम सख्त एलियासिंग नियम का उल्लंघन करता है?सख्त एलियासिंग उल्लंघन

#include <cstdint> 

int main() 
{ 
    double d = 0.1; 

    //std::int64_t n = *reinterpret_cast<std::int64_t*>(&d); // aliasing violation 

    //auto n{*reinterpret_cast<std::int64_t*>(&d)}; // aliasing violation 

    auto nptr{reinterpret_cast<std::int64_t*>(&d)}; 
    auto& n{*nptr}; 

    ++n; 
} 

कोई चेतावनी VS2015, clang या gcc द्वारा उत्सर्जित।

उत्तर

5

क्या निम्न प्रोग्राम सख्त एलियासिंग नियम का उल्लंघन करता है?

हाँ, ऐसा करता है। std::int64_t* का उपयोग करके आप double* (&d) को संदर्भित कर रहे हैं।

लाइन है कि सख्त अलियासिंग नियम का उल्लंघन करती है:

auto& n{*nptr}; 

पंक्ति की प्रक्रिया है, compilers जरूरी पता नहीं कैसे आप nptr का मूल्य निर्धारित किया है। तथ्य यह है कि यह double* का उपनाम है, उस पंक्ति को संसाधित करते समय स्पष्ट नहीं है।

5

हां, यह सख्त अलियासिंग का उल्लंघन करता है। आप प्रकार double के ऑब्जेक्ट तक पहुंच रहे हैं, हालांकि एक पॉइंटर nptr जो double या उससे संबंधित किसी भी प्रकार के सूचक नहीं है।

सिर्फ इसलिए कि एक कंपाइलर चेतावनी को उत्सर्जित नहीं करता है इसका मतलब यह नहीं है कि यह उल्लंघन नहीं है। सख्त उभरने के उल्लंघन यूबी हैं (क्योंकि वे रनटाइम व्यवहार का विषय हैं) और इसलिए निदान की आवश्यकता नहीं है।

+0

पुन "सख्त [एलियासिंग] के उल्लंघन यूबी हैं", बिलकुल नहीं। सख्त एलियासिंग एक जीसीसी धारणा है जो इसके अनुकूलन से जुड़ा हुआ है। इसके बजाय सी ++ मानक के नियम हैं कि पोर्टेबल तरीकों में पुनरावृत्ति के परिणामों का उपयोग कैसे किया जा सकता है (या नहीं)। इस उदाहरण में औपचारिक यूबी का कारण बनता है। लेकिन उदाहरण किसी दिए गए प्लेटफॉर्म पर अच्छा हो सकता है। –

+0

@ चीयर्संधथ.-अल्फ: "* सी ++ मानक के बजाय नियम हैं कि पोर्टेबल तरीकों में पुनरावृत्ति के परिणामों का उपयोग कैसे किया जा सकता है (या नहीं)। *" और उन नियमों को आम तौर पर "सख्त एलियासिंग नियम" कहा जाता है; यह शब्द जीसीसी विकल्प से आ सकता है, लेकिन नियम स्वयं नहीं करते हैं। तो मुझे नहीं लगता कि आपका मुद्दा क्या है। और नहीं, उदाहरण किसी भी मंच पर अच्छी तरह से परिभाषित व्यवहार होने की अनुमति नहीं है। 3.10/10 आपको सूचकांक के माध्यम से 'int64_1'' के माध्यम से कभी भी * डबल 'के मान तक पहुंचने की अनुमति नहीं देता है। –

+0

दृश्य यह है कि सी और सी ++ * विशिष्ट प्लेटफॉर्म पर पनिंग टाइप नहीं कर सकते हैं वास्तविकता के विपरीत है। इसलिए प्रतिक्रिया का एक बहुत अच्छा उदाहरण है जिसे मैंने इंगित करने का प्रयास किया था। दुर्भाग्य से यह दृश्य g ++ बनाता है (और एक प्लग-इन प्रतिस्थापन के रूप में झुकाव) कम व्यावहारिक रूप से उपयोगी हो सकता था। –

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