2012-05-12 13 views
7

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?

+0

Co ciekawe, nie dostaję żadnych błędów w gcc 4.7 na Ubuntu 12.04, 64-bit. – juanchopanza

+0

@juanchopanza Czy działa z '-Wstrict-aliasing = 2'? – StackedCrooked

+0

Tak, robi. Nawet ostrzeżenie. – juanchopanza

Odpowiedz

3

Podejmując adres std::array wyrażenie arr[0] jest równoważne wywołaniu funkcji arr.operator[](0) która zwraca odwołanie, zamiast wyrażenia arytmetycznego wskaźnik (arr + 0). Być może kompilator nie próbuje "przejrzeć" wywołania funkcji operator[] podczas generowania ostrzeżeń aliasingowych.