【问题标题】:signed:ness optimization "bug" in gccgcc 中的签名:ness 优化“错误”
【发布时间】:2012-04-25 14:41:16
【问题描述】:

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

#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

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

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

【问题讨论】:

  • 我在 gcc 4.1.2 或 4.7 中没有收到该警告——你不应该,至少在第 4 行(n_portnbr 的声明)。 htons() 返回一个uint16_t,很可能是short unsigned int,并且您将该结果分配给uint16_t 对象。 #include &lt;arpa/inet.h&gt; 应该给你正确的htons() 声明。 return 声明可能是个问题,但我没有收到警告——显然你也没有。您是否复制并粘贴了您的准确代码?
  • 如何在您的系统上声明htons()
  • 外部 uint16_t htons (uint16_t __hostshort)

标签: c++ linux gcc compiler-construction warnings


【解决方案1】:

这似乎是 glibc 中的一个错误。看到这个bug report

【讨论】:

    【解决方案2】:

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

    uint16_t n_portnbr = (htons)(portnbr);
    

    看看这是否解决了你的问题,这个语法确保触发函数而不是宏。

    如果是这样的话,真的很遗憾他们弄错了。然后,您应该尝试仅针对该版本关闭该宏。

    【讨论】:

    • 这个有效。消除了我的警告,但我还需要在运行时检查。
    • @cateof,运行时需要检查什么?
    【解决方案3】:

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

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

    The Linux manual pagehtons() 声明:

    POSIX.1-2001。

    某些系统需要包含 而不是

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

    【讨论】:

    • 这也是我的第一反应,但至少从外观上看,他正在编译为 C++,在没有原型的情况下根本不允许调用。
    猜你喜欢
    • 2021-06-10
    • 2013-10-07
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    相关资源
    最近更新 更多