¿Cuándo es seguro char * para un estricto alias de puntero?

He estado tratando de entender las estrictas reglas de alias que se aplican al puntero de caracteres.

aquí esto se afirma:

Siempre se presume que un char * puede referirse a un alias de cualquier objeto.

Ok, en el contexto del código de socket, puedo hacer esto:

struct SocketMsg
{
   int a;
   int b;
};

int main(int argc, char** argv)
{
   // Some code...
   SocketMsg msgToSend;
   msgToSend.a = 0;
   msgToSend.b = 1;
   send(socket, (char*)(&msgToSend), sizeof(msgToSend);
};

Pero luego está esta declaración

Lo contrario no es cierto. Lanzar un char * a un puntero de cualquier tipo que no sea un char * y desreferenciarlo suele violar la estricta regla de alias.

¿Significa esto que cuando recibo una matriz de caracteres, no puedo reinterpretar la conversión a una estructura cuando conozco la estructura del mensaje:

struct SocketMsgToRecv
{
    int a;
    int b;
};

int main()
{
    SocketMsgToRecv* pointerToMsg;
    char msgBuff[100];
    ...
    recv(socket, msgBuff, 100);
    // Ommiting make sure we have a complete message from the stream
    // but lets assume msgBuff[0]  has a complete msg, and lets interpret the msg

    // SAFE!?!?!?
    pointerToMsg = &msgBuff[0];

    printf("Got Msg: a: %i, b: %i", pointerToMsg->a, pointerToMsg->b);
}

¿Este segundo ejemplo no funcionará porque el tipo base es una matriz de caracteres y lo estoy convirtiendo en una estructura? ¿Cómo manejas esta situación en un mundo estrictamente alias?

Respuestas a la pregunta(2)

Su respuesta a la pregunta