Допустим, мы знаем layout (т.е. количество полей и тип каждого поля) сишной структуры, но не знаем имена полей.
Нужно сгенерировать сишный код, который:
1. создаст экземпляр структуры, заполнит поля определёнными данными (нет, struct S s = {1, 2, 3};
писать нельзя, по определённым причинам);
2. считает значения полей существующей структуры.
Допустим, известно, что это struct S
и у неё три поля типа int
.
Втупую:
struct S_compat { int a0; int a1; int a2; } s_compat;
s_compat.a0 = /* ... */;
s_compat.a1 = /* ... */;
s_compat.a2 = /* ... */;
struct S s;
* (struct S_compat *) &s = s_compat;
Насколько я понимаю, здесь UB из-за pointer aliasing. Так ли это?
Далее:
struct S_compat { int a0; int a1; int a2; } s_compat;
s_compat.a0 = /* ... */;
s_compat.a1 = /* ... */;
s_compat.a2 = /* ... */;
struct S s;
memcpy(&s, &s_compat, sizeof(struct S));
Есть ли здесь UB? Если да, то как это сделать правильно?
Если можно, приведите ссылки на релевантные места стандарта. Спасибо.
P.S. про -fno-strict-aliasing
, __attribute((__may_alias__))
знаю, хотелось бы в рамках стандарта.