2015-12-22 12 views
5

L'istanza minima del mio problema che mi è venuto in mente è la seguente:Segmentation fault dopo il ritorno di una struttura allineata

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

Questo pezzo di risultati di codice in segmentation fault quando eseguito se compilato con clang++ (versione 3.4, quello predefinito disponibile in Ubuntu 14.04). Il problema non si verifica quando compilo questo con g++ (versione 4.8.4). È un bug del compilatore o c'è qualche problema con il mio codice?

Come nota: il programma non si blocca se bar è STACK-assegnati, cioè .:

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

funziona come previsto.

+0

Fa alcuna differenza se si cancella la barra; prima di uscire? –

+0

@ BarışUşaklı: No. Il problema è precisamente con l'istruzione 'return foo;' Se lo sostituisco, ad esempio, 'return Foo (0.0f, 0.0f, 0.0f);' il problema è scomparso. – mrhania

+0

Sollevalo come un bug nel sito del bug appropriato? Questo non è un sito di segnalazione bug. –

risposta

0

Immagino che la versione basata sullo stack sia allineata ok per fortuna. Aggiungere un U8 prima delle istruzioni potrebbe rendere lo stack diverso in modo da poterlo testare. Quando lo metti nell'heap, diventa casuale :-) C'è una possibilità che tu abbia riscontrato un bug nella generazione del codice Probabilmente i tuoi valori a 32 bit sono stati allineati sui limiti a 16 bit e il codice è stato generato per l'accesso non allineato. X86 gestiva silenziosamente questa eccezione ma non per i float. Vale anche la pena di provare a passare a ints.

Problemi correlati