Когда char * безопасен для строгого наложения указателей?

Я пытался понять строгие правила псевдонимов, поскольку они применяются к указателю на символ.

Вот это заявлено:

Всегда предполагается, что char * может ссылаться на псевдоним любого объекта.

Итак, в контексте кода сокета, я могу сделать это:

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

Но тогда есть это утверждение

Обратное неверно. Приведение char * к указателю любого типа, кроме char *, и разыменование его, как правило, нарушают правило строгого наложения имен.

Означает ли это, что когда я получаю массив символов, я не могу переосмыслить приведение к структуре, когда знаю структуру сообщения:

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

Этот второй пример не будет работать, потому что базовый тип - это массив символов, и я приведу его к структуре? Как вы справляетесь с этой ситуацией в строго псевдонимном мире?

Ответы на вопрос(2)

Ваш ответ на вопрос