2010-02-09 1 views

risposta

-2

Prova passando -fno -strict-aliasing in gcc.

Per fare chiarezza sull'argomento di aliasing rigido, controllare questo question.

+0

Grazie, Gonzalo. Non volevo porvi rimedio nel Makefile, dato che sto solo aggiungendo una funzionalità a una libreria esistente, ma ora che ci sto pensando, non sembra un problema. –

+0

Ha. Facile. Ho solo bisogno di superare la mia paura dei Makefile. –

+2

Disabilitare le funzionalità per aggirare gli avvertimenti del compilatore è generalmente una cattiva idea. È meglio comprendere l'avviso e modificare il codice. Quando esegui lo slap -fno-strict-aliasing sulla tua riga di compilazione stai dicendo che il compilatore è sbagliato. In generale, è una buona idea presumere che il tuo codice sia il problema. Detto questo, ogni esempio di codice per il passaggio di descrittori di file tramite socket di dominio che abbia mai visto è stato scritto utilizzando lo schema di dereferenziamento nella domanda originale. GCC ha appena iniziato a parlarne di recente. – petrsnd

6

A meno che qualcosa non funzioni, non si verifica alcun aliasing effettivo - l'oggetto a cui fa riferimento * (int *) CMSG_DATA (hdr) non è un alias per hdr - è passato alla fine di hdr. L'avviso è errato.

È possibile aggirare con memcpy:

memcpy(CMSG_DATA(hdr), &fd2pass, sizeof(int)); 

Non utilizzare -fno-strict-aliasing: che disattiva le ottimizzazioni che assumono rigorosa aliasing; potrebbe generare codice notevolmente peggiore.

Per i dettagli tecnici, vedere glibc bug 16197.

+1

Sono d'accordo con te, ma se non sei interessato alle prestazioni, l'opzione '-fno-strict-aliasing' è una soluzione eccellente, purché tutti i compilatori che utilizzi lo supportino. –

+1

Ignorare gli avvisi del compilatore senza capire cosa sta succedendo è pigro e pericoloso. Un sacco di persone troveranno questa domanda e procederanno con la risposta accettata senza comprendere le implicazioni di -fno-strict-aliasing. La soluzione memcpy mi sembra una raccomandazione generale più accettabile. – petrsnd