2015-12-22 4 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でコンパイルした場合に実行セグメンテーションフォールトでのコードの結果のこの作品、 Ubuntu 14.04で利用可能なデフォルトのもの)。この問題は、g++(バージョン4.8.4)でコンパイルすると発生しません。これはコンパイラのバグですか、私のコードに何か問題がありますか?

側の注意点としては:barがスタックに割り当てられている場合は、プログラムがクラッシュしない、すなわち:意図したとおりに

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

作品。

+0

終了する前にバーを削除すると何か違いはありますか? –

+0

@BarışUşaklı:Nope。問題は 'return foo;'ステートメントとまったく同じです。たとえば、 'return Foo(0.0f、0.0f、0.0f);と置き換えると、問題はなくなります。 – mrhania

+0

適切なバグサイトでバグとして報告しますか?これはバグを報告する場所ではありません。 –

答えて

0

私は、スタックベースのバージョンが運に整列していると思います。命令の前にU8を追加すると、スタックを異なるものにしてテストすることができます。 ヒープに配置するとランダムになります:-) コード生成でバグが発生した可能性があります。おそらく、32ビットの値が16ビットの境界に揃えられ、コードがアラインされていないアクセス用に生成されています。 X86はこの例外を静かに処理しますが、浮動小数点数は処理しません。それはintに変更しようとする価値もあります。

関連する問題