Допустим, мы знаем layout (т.е. количество полей и тип каждого поля) сишной структуры, но не знаем имена полей.

Нужно сгенерировать сишный код, который:

1. создаст экземпляр структуры, заполнит поля определёнными данными (нет, struct 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__)) знаю, хотелось бы в рамках стандарта.








 ,






URL записи