He estado tratando de entender las reglas de aliasing estrictas que se aplican al puntero de char.¿Cuándo es seguro * para el alias de puntero estricto?
Here Esto se afirma:
Siempre se presume que un char * puede hacer referencia a un alias de cualquier objeto.
Ok por lo que en el contexto del código de zócalo, que 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 char * y quitarle la referencia por lo general infringe la regla de aliasing estricta.
¿Quiere decir esto que cuando Recv una matriz de caracteres, no puedo reinterpretar fundido a una estructura cuando sé que 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);
}
Será este segundo ejemplo no funcionar debido a que el El tipo base es una matriz char y la estoy lanzando a una estructura. ¿Cómo manejas esta situación en un mundo estrictamente alias?
¿No es necesario que la segunda parte del código se llame explícitamente? ¿Ha habilitado todas las advertencias? –