Podczas kompilowania następującego kodu z gcc 4.7 (g ++ - mp-4.7 (GCC) 4.7.0 zbudowany z MacPorts na OS X) uzyskuję pozornie sprzeczne wyniki.Ścisłe aliasing i std :: array vs tablica stylu C
Kompilator nie uskarża się, gdy próbuję ponownie zinterpretować i zinterpretować sekcję std::array
jako uint32_t
, ale robi to podczas korzystania z tablicy typu C.
Przykład Kod:
#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]
}
polecenie kompilator:
$ g++ -o test -std=c++0x -Wall -Wextra -Werror main.cpp
co są traktowane inaczej?
Co ciekawe, nie dostaję żadnych błędów w gcc 4.7 na Ubuntu 12.04, 64-bit. – juanchopanza
@juanchopanza Czy działa z '-Wstrict-aliasing = 2'? – StackedCrooked
Tak, robi. Nawet ostrzeżenie. – juanchopanza