たとえば、このコードは有効ですか、それともエイリアシング ルールに違反して未定義の動作を引き起こしますか?
int x;
struct s { int i; } y;
x = 1;
y = *(struct s *)&x;
printf("%d\n", y.i);
私の関心は、これに基づく手法を使用して、エイリアス読み取りを実行するための移植可能な方法を開発することです。
更新: これは意図した使用例です。少し異なりますが、上記が有効な場合にのみ有効です。
static inline uint32_t read32(const unsigned char *p)
{
struct a { char r[4]; };
union b { struct a r; uint32_t x; } tmp;
tmp.r = *(struct a *)p;
return tmp.x;
}
必要に応じて、GCC はこれを単一の 32 ビット ロードにコンパイルし、p
実際に 以外の型を指している場合に発生する可能性のあるエイリアシングの問題を回避しているようですchar
。つまり、GNU C__attribute__((__may_alias__))
属性のポータブルな代替品として機能しているようです。しかし、それが本当に明確に定義されているかどうかはわかりません...