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?
È interessante notare che non ho alcun errore su gcc 4.7 su Ubuntu 12.04, 64 bit. – juanchopanza
@juanchopanza Funziona con '-Wintict-aliasing = 2'? – StackedCrooked
Sì, lo fa. Neanche un avvertimento. – juanchopanza