当我处理一些代码时,编译器会产生这个警告,这些代码看起来像-
....
for(p = res; p != NULL; p = p->ai_next) {
void *addr;
std::string ipVer = "IPv0";
if(p->ai_family == AF_INET) {
ipVer = "IPv4";
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
addr = &(ipv4->sin_addr);
}
else {
ipVer = "IPv6";
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
addr = &(ipv6->sin6_addr);
}
....
}其中p = res的类型为struct addrinfo,生成警告的类型为sockaddr_in和sockaddr_in6。警告来自声明:
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;我只想知道是什么引起了这一警告,如果这不是正确的做法,我还能做些什么来纠正它。我能用一下static_cast / dynamic_cast / reinterpret_cast吗?
确切的警告是- cast from 'struct sockaddr *' to 'struct sockaddr_in *' increases required alignment from 2 to 4。
发布于 2016-02-22 13:12:21
好的,-Weverything支持了相当多的警告,其中一些已知会抛出不想要的警告。
在这里,您的代码触发了cast-align警告,这说明了
从..。敬..。增加所需的对齐。敬..。
这里是这样的,因为struct addr的对齐值只有2,而struct addr_in的对齐值是4。
但是you (以及getaddrinfo的程序员)知道指针p->ai_addr已经指向一个实际的struct addr_in,所以强制转换是有效的。
你可以:
-Wno-cast-align在-Weverything之后保持沉默我必须承认,我很少使用-Weverything,而且只使用-Wall。
或者,如果您知道只使用CLang,则可以使用语用学解释只在这些行中打开警告()。
for(p = res; p != NULL; p = p->ai_next) {
void *addr;
std::string ipVer = "IPv0";
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wcast-align"
if(p->ai_family == AF_INET) {
ipVer = "IPv4";
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
addr = &(ipv4->sin_addr);
}
else {
ipVer = "IPv6";
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
addr = &(ipv6->sin6_addr);
}
#pragma clang diagnostic pop
....
}发布于 2017-12-09 11:03:03
来详细说明memcpy版本。我认为这是ARM所需要的,因为它不能有错误的数据。
我创建了一个仅仅包含前两个字段的结构(我只需要端口)
struct sockaddr_in_header {
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
};然后,为了获得端口,我使用memcpy将数据移动到堆栈中。
struct sockaddr_in_header sinh;
unsigned short sin_port;
memcpy(&sinh, conn->local_sockaddr, sizeof(struct sockaddr_in_header));并返回港口
sin_port = ntohs(sinh.sin_port);这个答案实际上与使端口在Arm上有关。
那些被认为是和这个问题相同的权力,但是我不想忽视警告。经验告诉我,这是个坏主意。
https://stackoverflow.com/questions/35551879
复制相似问题