¿La herencia a través del desenrollado viola la estricta regla de alias?

Tengo una estructura X que hereda de la estructura Base. Sin embargo, en mi configuración actual, debido a la alineación, el tamaño de X es 24B:

typedef struct {
    double_t a;
    int8_t b;
} Base;

typedef struct {
    Base base;
    int8_t c;
} X;

Para guardar la memoria, me gustaría desenrollar la estructura Base, por lo que creé la estructura Y que contiene campos desde la Base (en el mismo orden, siempre al comienzo de la estructura), por lo que el tamaño de la estructura es 16B :

typedef struct {
    double_t base_a;
    int8_t base_b;
    int8_t c;
} Y;

Luego usaré la instancia de struct Y en un método que espera un puntero a Base struct:

void print_base(Base* b)
{
  printf("%f %d\n", b->a, b->b);
}
// ...
Y data;
print_base((Base*)&data);

¿El código anterior viola la estricta regla de alias y causa un comportamiento indefinido?

Respuestas a la pregunta(1)

Su respuesta a la pregunta