2015-12-22 10 views
5

मेरी समस्या के कम से कम उदाहरण है कि मैं के साथ आया था लौटने के बाद इस प्रकार है के रूप में:विभाजन गलती एक गठबंधन संरचना

struct __attribute__((aligned(16))) Foo { 
    float x, y, z; 
    Foo(float x, float y, float z) : x(x), y(y), z(z) {} 
}; 

class Bar { 
public: 
    Foo foo; 

    Bar(const Foo &foo) : foo(foo) {} 
    Foo bar() { return foo; } 
}; 

int main() 
{ 
    Bar *bar = new Bar(Foo(0.0f, 0.0f, 0.0f)); 
    bar->bar(); 
    return 0; 
} 

जब चलाते हैं clang++ (संस्करण 3.4 के साथ संकलित विभाजन गलती में कोड परिणामों का यह टुकड़ा, उबंटू 14.04 में उपलब्ध डिफ़ॉल्ट)। समस्या तब नहीं होती जब मैं g++ (संस्करण 4.8.4) के साथ संकलित करता हूं। क्या यह एक कंपाइलर बग है या क्या मेरे कोड में कुछ समस्या है?

एक तरफ ध्यान दें के रूप में: अगर bar स्टैक-आवंटित किया जाता है कार्यक्रम क्रैश नहीं होता, यानी .:

Bar bar(Foo(0.0f, 0.0f, 0.0f)); 
bar.bar(); 

काम करता है के रूप में इरादा।

+0

यदि आप बार हटाते हैं तो इससे कोई फर्क पड़ता है; बाहर निकलने से पहले? –

+0

@ BarışUşaklı: नहीं। समस्या ठीक है 'वापसी foo;' कथन के साथ। यदि मैं इसे प्रतिस्थापित करता हूं, उदाहरण के लिए, 'वापसी Foo (0.0f, 0.0f, 0.0f);' समस्या समाप्त हो गई है। – mrhania

+0

उचित बग साइट पर बग के रूप में इसे बढ़ाएं? यह एक बग रिपोर्टिंग स्थल नहीं है। –

उत्तर

0

मुझे लगता है कि स्टैक आधारित संस्करण भाग्य से ठीक हो गया है। निर्देश से पहले एक यू 8 जोड़ना ढेर अलग कर सकता है ताकि आप इसका परीक्षण कर सकें। जब आप इसे ढेर पर रखते हैं तो यह यादृच्छिक हो जाता है :-) कोड पीढ़ी में आपको बग का अनुभव करने का मौका है क्योंकि संभवतः आपके 32 बिट मान 16 बिट सीमाओं पर गठबंधन हो गए हैं और कोड को असाइन किए गए एक्सेस के लिए जेनरेट किया गया है। X86 चुपचाप इस अपवाद को संभालेगा लेकिन फ्लोट के लिए नहीं। इनट्स को बदलने का प्रयास करने के लायक भी है।

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