2015-12-22 5 views
5

Die minimale Instanz meines Problems zurückkehren, die ich mit kam sich wie folgt:Segmentation fault nach einer ausgerichteten Struktur

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; 
} 

Dieses Stück Code führt zu einer Segmentierung Fehler bei der Ausführung, wenn 3.4 mit clang++ (Version kompiliert, der Standard, der in Ubuntu 14.04 verfügbar ist). Das Problem tritt nicht auf, wenn ich dies mit g++ (Version 4.8.4) kompiliere. Ist das ein Compilerfehler oder gibt es ein Problem mit meinem Code?

Als Randbemerkung: Das Programm stürzt nicht ab, wenn bar wird Stack zugewiesen, d.h .:

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

Arbeiten wie vorgesehen.

+0

Macht es einen Unterschied, wenn Sie bar vor dem Beenden löschen? –

+0

@ BarışUşaklı: Nein. Das Problem ist genau mit der Anweisung 'return foo;'. Wenn ich es zum Beispiel durch 'return Foo (0.0f, 0.0f, 0.0f);' ersetzen, ist das Problem weg. – mrhania

+0

Raise es als ein Fehler auf der entsprechenden Seite Bug? Dies ist kein Veranstaltungsort für Fehlerberichte. –

Antwort

0

Ich denke, dass Stack-basierte Version durch Glück ok ausgerichtet wird. Das Hinzufügen eines U8 vor der Anweisung könnte den Stapel anders machen, damit Sie ihn testen können. Wenn Sie es auf Heap platzieren, wird es zufällig :-) Es gibt eine Chance, die Sie Fehler bei der Code-Generierung erfahren haben Wahrscheinlich wurden Ihre 32bit-Werte auf 16bit Grenzen ausgerichtet und Code wurde für nicht ausgerichteten Zugriff generiert. X86 würde diese Ausnahme im Hintergrund behandeln, aber nicht für Floats. Das ist es auch wert zu versuchen, zu ints zu wechseln.