Wann ist char * für striktes Pointer-Aliasing sicher?

Ich habe versucht, die strengen Aliasing-Regeln zu verstehen, die für den Zeichenzeiger gelten.

Hie das ist angegeben:

Es wird immer vorausgesetzt, dass ein char * auf einen Alias eines beliebigen Objekts verweisen kann.

Ok also im Zusammenhang mit Socket-Code kann ich dies tun:

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

Aber dann gibt es diese Aussage

Das Gegenteil ist nicht wahr. Das Umwandeln eines Zeichens * in einen Zeiger eines anderen Typs als ein Zeichen * und dessen Dereferenzierung verstößt normalerweise gegen die strikte Aliasing-Regel.

Bedeutet dies, dass ich beim Abrufen eines char-Arrays die Umwandlung in eine Struktur nicht neu interpretieren kann, wenn ich die Struktur der Nachricht kenne:

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

Funktioniert dieses zweite Beispiel nicht, weil der Basistyp ein char-Array ist und ich es in eine Struktur umwandle? Wie gehen Sie mit dieser Situation in einer streng gegliederten Welt um?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage