Рассмотрим следующий фрагмент, который адаптирован из исходного кода Tor:
/* This can be a malloc wrapper with minimal initialization. */
other_t *make_other(void);
/* This struct is never defined. */
struct undef;
typedef struct undef undef_t;
undef_t *make_undef(void)
{
other_t *other = make_other();
return (undef_t*)other;
}
Предположим, что все указатели undef_t
в программе отличены указателями other_t
и предполагают, что все процедуры, которые принимают undef_t*
, передают их в other_t*
перед использованием.
В соответствии с разделом 6.3.2.3 стандарта C99 приведение в оператор return
вызывает поведение undefined, если other
неправильно выровнено как указатель на undef_t
, но если это так, результат make_undef
назад на other_t*
возвращает исходный указатель, возвращенный make_other
. Однако undef_t
- это тип undefined, и я не могу найти никаких правил выравнивания относительно них. Эти преобразования все еще работают так, как если бы они были undef_t
и имели правильное выравнивание?