Например, действительно ли этот код действителен или вызывает поведение undefined, нарушая правила псевдонимов?
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__))
. Но я не уверен, действительно ли он определен...