签名:GCC 中的 NESS 优化"bug"

signed:ness optimization "bug" in gcc

本文关键字:优化 bug NESS 中的 GCC 签名      更新时间:2023-10-16

我的代码有一个警告,我不知道如何避免它。这是一个代码片段

#include <arpa/inet.h>
int main(void) {
        uint16_t portnbr=0;
        uint16_t n_portnbr = htons(portnbr);
        return n_portnbr;
}

编译器:

/usr/bin/g++ -Wconversion -Wall  -O2 a.cpp

输出:

a.cpp:4: warning: conversion to 'short unsigned int' from 'int' may alter its value

是否可以避免警告?没有修改 CFLAG 的选项

我的编译器是 gcc 版本 4.3.4 [gcc-4_3-branch 修订版 152973] (SUSE Linux)

这似乎是glibc中的一个错误。 请参阅此错误报告。

为了提高效率,htons和亲戚经常被宏重载。尝试类似的东西

uint16_t n_portnbr = (htons)(portnbr);

若要查看这是否解决了您的问题,此语法确保触发函数而不是宏。

如果是这种情况,那真的很可惜他们弄错了。然后,您应该尝试仅为该版本关闭该宏。

可能只是一个缺失的原型,这就是警告听起来的样子。

尝试手动声明htons()函数,看看是否有帮助。如果是这样,则需要调查标头。

htons()的 Linux 手册页声称:

POSIX.1-2001.

有些系统需要包含而不是。

更新:正如评论中指出的那样,这是C++,因此它不应该"遭受"函数的隐式声明。奇怪。我建议阅读预处理的代码,也许htons()是一个由于某种原因行为奇怪的宏。