10

Betrachten Sie diese zwei Funktionen:Wird beim Konvertieren eines char-Arrays in einen anderen Typ die strikte Alias-Regel verletzt?

int f1() 
{ 
    alignas(int) char buf[sizeof(int)] = {}; 
    return *reinterpret_cast<int*>(buf); 
} 

int f2() 
{ 
    alignas(int) char buf[sizeof(int)] = {}; 
    char* ptr = buf; 
    return *reinterpret_cast<int*>(ptr); 
} 

GCC warnt davor, dass die erste strenge Aliasing Regeln verstößt. Aber die zweite ist in Ordnung.

Clang akzeptiert beide ohne Beanstandung.

Ist die Warnung legitim?

+0

Ja. Das "Objekt" ist hier entweder ein 'char' oder das Array von' char's und der glvalue ist vom Typ 'int'; nichts in https://timsong-cpp.github.io/cppwp/basic.lval#8 deckt diesen Fall ab. –

Antwort

8

Die Warnung ist zulässig. f2 ist nicht in Ordnung (es ist ein undefiniertes Verhalten), es verursacht nur keine Warnung.

Ich vermute, dass der Grund, dass f2 provozieren die Warnung nicht, dass:

int f3() 
{ 
    int i = 0; 
    char *ptr = reinterpret_cast<char*>(&i); 
    return *reinterpret_cast<int*>(ptr); 
} 

Ist völlig legal. Sie können einen char* (oder einen void*) als "universellen Zeiger" verwenden - vorausgesetzt, Sie werfen vor dem Zugriff auf den richtigen Typ zurück. GCC ist eindeutig darauf bedacht, die Warnung vor f3 zu vermeiden, zu einem Preis von nicht zu warnen über f2.

Clang warnt vor entweder f1 oder f2 - aber es ist nicht erforderlich.

+0

Benötigt Standard-Anführungszeichen. –

Verwandte Themen