2011-12-18 8 views
6

estoy tratando de compilar el siguiente en gcc con -pedantic-errors -pedantic -Wall -O2advertencia aliasling estricto de gcc 4.6.1 fallo

#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(); 
} 

Pero aún no hay advertencias aliasing estrictas. También he intentado habilitar

-fstrict-aliasing 
-Wstrict-aliasing 

pero todavía no hay advertencias. ¿Es esto un error?

+1

Lo que estás tratando de hacer no tiene ningún sentido. ¿Por qué no simplemente '' pi = 0'? – Pubby

+4

@Pubby: Presumiblemente, este es solo un caso de prueba mínimo artificial ... –

+0

En primer lugar, las reglas de alias permiten las conversiones desde y hacia 'char *'. En segundo lugar, g ++ no promete advertir, solo dice que lo intentará. Si lo cambia para convertir directamente a 'uint16_t' y tiene' -Wstrict-aliasing = 1' le dará una advertencia. – Omnifarious

Respuesta

1

Reescribí tu ejemplo para producir una advertencia de romper las reglas estrictas-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; 
} 

A pesar de que, g ++ 4.6 sólo se muestra la advertencia si se compila el código con -Wstrict-aliasing=2 en lugar de -Wstrict-aliasing. Además, solo muestra la advertencia para el elenco en main(), no en foo(). Pero no puedo ver cómo/por qué el compilador vería esos dos moldes de manera diferente.

+0

¿Cuál es la diferencia con '-Wstrict-aliasing = 2' y' -Wstrict-aliasing'? – user1086635

+0

@ user1086635: Supuestamente, los tres niveles de detección de alias estrictos tienen tasas de falsos positivos cada vez más bajas a través de un análisis más detallado del código. 1 es el "peor" nivel con la tasa más alta de falsos positivos, y 3 es el "mejor" nivel con la tasa de falsos positivos más baja. Al jugar con los niveles yo mismo, parece que 3 también tiene una alta tasa de falsos negativos. – Omnifarious

+0

"_Pero no puedo ver cómo/por qué el compilador vería esos dos moldes de manera diferente. _" Porque en 'main' el compilador conoce el tipo declarado de la variable. – curiousguy

Cuestiones relacionadas