解除引用指针确实会破坏使用Berkeley套接字的严格抗锯齿规则

Nan*_*ket 11 c compiler-warnings berkeley-sockets

我有一些看起来像这样的代码,其中addr是一个sockaddr*:

struct sockaddr_in *sin = (struct sockaddr_in *) addr;
const char *IP=inet_ntoa(sin -> sin_addr);
Run Code Online (Sandbox Code Playgroud)

我相信这是使用Berkeley套接字的非常典型的代码.

但是,当我编译它时,我收到以下警告:
dereferencing pointer 'sin' does break strict anti-aliasing rules

在线搜索,我发现一些关于我正在做事的方式非常典型的事实的讨论,但这个编译器警告也是非常真实的并不是一件好事.

重做此代码以修复警告的正确方法是什么,而不仅仅是沉默它?

tlo*_*ach 5

我遇到了同样的问题 - 它看起来像是gcc中的一个bug.

我能够通过使用来绕过它

(*sin).sin_addr
Run Code Online (Sandbox Code Playgroud)

代替

sin->sin_addr
Run Code Online (Sandbox Code Playgroud)


Win*_*mer -2

如果您的头文件和编译器都是同一个 C 或 C++ 实现的一部分,请向您的供应商投诉并要求他们在头文件中放置合适的 #pragma 以使编译器保持沉默。作为实现者,只要他们提供符合要求的实现,他们就可以玩这样的游戏。

如果您的头文件和编译器来自两个独立的 C 或 C++ 实现,那么您很幸运,事情能够正常工作,并且您必须自己解决它。