這裏是一個SSCCE,表現出我的代碼的簡化版本,仍然沒有一些有用的東西:ARM上的`ntohs(...)`錯誤`-Wsign-conversion`錯誤?
//Compile with -O3 -Wsign-conversion
#include <arpa/inet.h>
#include <string>
void _extract_ip_port(struct sockaddr const* addr, std::string* host,unsigned short* port) {
if (addr->sa_family == AF_INET) { //IPv4
struct sockaddr_in const* ipv4 = reinterpret_cast<struct sockaddr_in const*>(addr);
char temp[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &ipv4->sin_addr, temp, INET_ADDRSTRLEN);
*host = temp;
*port = ntohs(ipv4->sin_port); //<---- ##### WARNING HERE #####
} else { //IPv6
struct sockaddr_in6 const* ipv6 = reinterpret_cast<struct sockaddr_in6 const*>(addr);
char temp[INET6_ADDRSTRLEN];
inet_ntop(AF_INET6, &ipv6->sin6_addr, temp, INET6_ADDRSTRLEN);
*host = temp;
*port = ntohs(ipv6->sin6_port); //<---- ##### WARNING HERE #####
}
}
的問題是,要ntohs(...)
生成類似電話:
<file>:<line>:<char>: warning: conversion to "unsigned int" from "int" may change the sign
of the result [-Wsign-conversion]
*port = ntohs(ipv6->sin6_port); //<---- ##### WARNING HERE #####
^
正如你所看到的從上面鏈接的文檔中,ntohs(...)
有一個重載並返回一個unsigned short。由於port
,ipv4->sin_port
和ipv6->sin6_port
都是這樣,所以不應該發生此警告。所以我的問題:怎麼回事?
g ++版本爲5.3.0-3ubuntu1~14.04
,系統基於ARMv7。我還沒有能夠在x86或x86-64上重現這一點,所以我也標記它arm。
提示:您可以使用'-E'選項來獲得預處理輸出以製作更簡潔的示例。只要檢查'-E'輸出的結尾。我用這個來找到ARM版本的'ntohs',就像我的答案一樣。 –