2011-12-18 3 views
6

Sto cercando di compilare il seguente su gcc con -pedantic-errors -pedantic -Wall -O2Strict avvertimento aliasling su gcc 4.6.1 bug

#include <iostream> 

void reset_uint32(uint32_t* pi) 
{ 
    char* c = (char*)(pi); 
    uint16_t* j = (uint16_t*)(c); // warning? 
    j[0] = 0; 
    j[1] = 0; 
} 

void foo() 
{ 
    uint32_t i = 1234; 
    reset_uint32(&i); 
} 

int main() { 
    foo(); 
} 

Ma io non vedo alcun severi avvertimenti di aliasing. Ho anche provato ad abilitare

-fstrict-aliasing 
-Wstrict-aliasing 

ma ancora nessun avviso. È un bug?

+1

Quello che stai cercando di fare non ha alcun senso. Perché non fare semplicemente '* pi = 0'? – Pubby

+4

@Pubby: Presumibilmente questo è solo un caso di prova minimamente forzato ... –

+0

Per prima cosa, le regole di aliasing consentono conversioni da e verso 'char *'. In secondo luogo, g ++ non promette di avvisare, dice solo che proverà. Se lo cambi per convertire direttamente in 'uint16_t' e hai' -Wintict-aliasing = 1' ti darà un avvertimento. – Omnifarious

risposta

1

ho riscritto il tuo esempio per la produzione di un avvertimento di infrangere le regole severe-aliasing:

void foo(int* pi) { 
    short* j = (short*)pi; 
    j[0] = j[1] = 0; 
} 

int main() { 
    int i = 1234; 

    foo(&i); 

    short* j = (short*)&i; 
    j[0] = j[1] = 0; 
} 

Anche se, g ++ 4.6 mostra solo l'avviso se si compila il codice con -Wstrict-aliasing=2 invece di -Wstrict-aliasing. Inoltre, mostra solo l'avviso per il cast in main(), non in foo(). Ma non riesco a vedere come/perché il compilatore guarderebbe a questi due calchi in modo diverso.

+0

Qual è la differenza con '-Wintict-aliasing = 2' e' -Wittel-aliasing'? – user1086635

+0

@ user1086635: Presumibilmente i tre livelli di rilevamento degli alias rigidi hanno tassi di falsi positivi sempre più bassi attraverso un'analisi più dettagliata del codice. 1 è il livello "peggiore" con il più alto tasso di falsi positivi, e 3 è il livello "migliore" con il più basso tasso di falsi positivi. Giocando con i livelli me stesso, sembra che anche 3 abbia un alto tasso di falsi negativi. – Omnifarious

+0

"_Ma non riesco a vedere come/perché il compilatore guarderà i due calchi in modo diverso._" Perché in 'main' il compilatore conosce il tipo dichiarato della variabile. – curiousguy