gcc
次のコードがエラーなしで正常に動作する理由がわかりません( -fstrict-aliasing -Wstrict-aliasing=1
)。
#include <stdio.h>
int
main(void)
{
char n = 42;
char *p = &n;
int *q = (int *)p;
*q = 10;
printf("%d|%d\n", *p, *q);
return 0;
}
厳密なエイリアシング ルールに従うと、次のようになります。
n1570、§ 6.5 式
オブジェクトは、次の型のいずれかを持つ左辺値式によってのみアクセスされる格納された値を持つものとします。
— オブジェクトの有効な型と互換性のある型、
— オブジェクトの有効な型と互換性のある型の修飾されたバージョン
- オブジェクトの有効な型に対応する符号付きまたは符号なしの型である型、
- オブジェクトの有効な型の修飾されたバージョンに対応する符号付きまたは符号なしの型である型、
— 前述のタイプのいずれかをメンバーに含む集約型または共用体型 (再帰的に、サブ集約または含まれる共用体のメンバーを含む)、または
— 文字タイプ。
ただし、修飾されたバージョン、対応する符号付きまたは符号なしの型、文字型のいずれか*q
と互換性のある型はありません。*p
では、なぜ許可されているのでしょうか。