2012-05-12 13 views
7

Durante la compilazione del seguente codice con gcc 4.7 (g ++ - mp-4.7 (GCC) 4.7.0 creato con MacPorts su OS X) ottengo risultati apparentemente contraddittori.Aliasing rigoroso e array in stile C std :: array vs

Il compilatore non si lamenta quando provo a reinterpretare e dereferenziare una sezione di un std::array come uint32_t ma lo fa quando si utilizza un array in stile C.

codice Esempio:

#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] 
} 

comando del compilatore è:

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

Perché sono trattati in modo diverso?

+0

È interessante notare che non ho alcun errore su gcc 4.7 su Ubuntu 12.04, 64 bit. – juanchopanza

+0

@juanchopanza Funziona con '-Wintict-aliasing = 2'? – StackedCrooked

+0

Sì, lo fa. Neanche un avvertimento. – juanchopanza

risposta

3

Nel prendere l'indirizzo della std::array, l'espressione arr[0] è equivalente alla funzione di chiamata arr.operator[](0) che restituisce un riferimento, piuttosto che l'espressione aritmetica puntatore (arr + 0). Forse il compilatore non tenta di "vedere attraverso" la chiamata alla funzione operator[] quando genera avvisi di aliasing.