Рассмотрим следующий фрагмент, который адаптирован из исходного кода 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 и имели правильное выравнивание?