2012-05-12 22 views
7

Al compilar el siguiente código con gcc 4.7 (g ++ - mp-4.7 (GCC) 4.7.0 construido con MacPorts en OS X) obtengo resultados aparentemente contradictorios.Estricto aliasing y std :: array vs C-style array

El compilador no se queja cuando trato de reinterpretar y desreferenciar una sección de std::array como uint32_t, pero lo hace cuando se utiliza una matriz de estilo C.

código Ejemplo:

#include <array> 
#include <cstdint> 

int main() {  
    std::array<uint8_t, 6> stdarr; 
    *reinterpret_cast<uint32_t*>(&stdarr[0]) = 0; // OK 

    uint8_t arr[6]; 
    *reinterpret_cast<uint32_t*>(&arr[0]) = 0; 
    //^error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing] 
} 

comandos del compilador es:

$ g++ -o test -std=c++0x -Wall -Wextra -Werror main.cpp 

por qué son tratados de manera diferente?

+0

Curiosamente, no recibo ningún error en gcc 4.7 en ubuntu 12.04, 64 bit. – juanchopanza

+0

@juanchopanza ¿Funciona con '-Wstrict-aliasing = 2'? – StackedCrooked

+0

Sí, lo hace. Ni siquiera una advertencia. – juanchopanza

Respuesta

3

Al tomar la dirección de la std::array, la expresión arr[0] es equivalente a la llamada de función arr.operator[](0) que devuelve una referencia, en lugar de la expresión aritmética de punteros (arr + 0). Quizás el compilador no intente "ver a través" de la llamada a la función operator[] al generar advertencias de aliasing.