Próbuję zrozumieć zasady ścisłego aliasingu, ponieważ mają zastosowanie do wskaźnika znaku.Kiedy jest char * bezpieczny dla aliasingu ze ścisłym wskaźnikiem?
Here to stwierdził:
To jest zawsze zakładać, że char * może odnosić się do aliasu dowolnego obiektu.
Ok, więc w kontekście kodeksu gniazda, mogę to zrobić:
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);
};
Ale potem jest to stwierdzenie
Odwrotna nie jest prawdą. Przesyłanie znaku * do wskaźnika dowolnego typu, innego niż znak * i dereferencja, zwykle narusza zasadę ścisłego aliasingu.
Czy to oznacza, że kiedy recv tablicy char, nie mogę reinterpretacji obsady do struct kiedy wiem strukturę wiadomości:
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);
}
Będzie to drugi przykład nie działa, ponieważ typem podstawowym jest tablica znaków i wrzucam ją do struktury? Jak radzisz sobie z tą sytuacją w ściśle sprecyzowanym świecie?
Czy drugi fragment kodu nie wymaga jawnie casr? Czy włączono wszystkie ostrzeżenia? –