Quando char * é seguro para aliasing estrito de ponteiro?

Eu tenho tentado entender as regras estritas de aliasing que se aplicam ao ponteiro de char.

Aqui isto é afirmado:

Sempre se presume que um caractere * pode se referir a um pseudônimo de qualquer objeto.

Ok, então no contexto do código do soquete, eu posso fazer isso:

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);
};

Mas depois há esta afirmação

O inverso não é verdadeiro. Converter um caractere * em um ponteiro de qualquer tipo que não seja um caractere * e desreferenciar sua referência geralmente viola a regra estrita de alias.

Isso significa que, quando recv uma matriz de caracteres, não consigo reinterpretar a conversão para uma estrutura quando conheço a estrutura da mensagem:

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 exemplo não funcionará porque o tipo base é uma matriz de caracteres e estou convertendo-o em uma estrutura? Como você lida com essa situação em um mundo estritamente restrito?

questionAnswers(2)

yourAnswerToTheQuestion