J'ai essayé de comprendre les règles d'alias strictes telles qu'elles s'appliquent au pointeur char.Quand char * est-il sûr pour un alias de pointeur strict?
Here c'est dit:
Il est toujours présumé qu'un char * peut se référer à un alias de tout objet.
Ok dans le contexte du code socket, je peux le faire:
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);
};
Mais il y a cette déclaration
L'inverse est pas vrai. Envoyer un char * à un pointeur de n'importe quel type autre qu'un char * et le déréférencer est généralement en violation de la règle stricte d'aliasing.
Est-ce que cela signifie que lorsque je RECV un tableau de caractères, je ne peux pas réinterprètent casting à une struct quand je connais la structure du message:
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);
}
ce deuxième exemple ne fonctionnera pas car la type de base est un tableau char et je le lance à une structure? Comment gérez-vous cette situation dans un monde strictement aliasé?
Le deuxième morceau de code ne vous oblige pas à casr explicitement? Avez-vous activé tous les avertissements? –