【问题标题】:warning: comparison is always false due to limited range of data type in gcc 4.1.2警告:由于 gcc 4.1.2 中数据类型的范围有限,比较总是错误的
【发布时间】:2013-03-14 00:15:09
【问题描述】:

我遇到了来自 gcc 4.1.2 的以下警告:

warning: comparison is always false due to limited range of data type

相关的C代码如下:

if ( unlikely(count < 0) ) BUG();

其中“计数”是无符号的。

由于不允许修改源代码,我尝试禁用警告:

-Wno-type-limits

但似乎 gcc 4.1.2 不支持它。

cc1: error: unrecognized command line option "-Wno-type-limits"

还有其他方法可以消除此警告吗?

【问题讨论】:

  • 为什么不保留警告?也许源代码的所有者需要看到它;摆脱它也可以掩盖其他错误。
  • 你被这段代码卡住了吗?是生成代码吗?
  • 我认为生成警告的是 GCC,而不是 GDB。 GDB 版本 4 比 GCC 4.1.2 更古老(尽管 GCC 4.1.2 相当古老,也许大约在 2006 年左右)。

标签: c linux gcc


【解决方案1】:

unsigned 值永远不会是负数——因此会发出警告。与其说是“不太可能”,不如说是“不可能”。

这通常表示代码中存在某种错误;编写代码时期望一个可以允许负值的类型,但该类型不允许负值。因此,由于预期不匹配,代码很可能会出现异常。

请注意,在某些机器上,普通的 char 是有符号的,而在其他机器上是无符号的(它是一种不同于 signed charunsigned char 的类型,即使它的值范围与其中一个重叠)。

【讨论】:

  • 是你的代码还是别人的代码?如果是你的代码,在什么情况下count的类型是有符号数量?您能否以签名的count 类型为条件进行测试?如果是别人的代码,你问过他们吗?您是否考虑过升级到更新的编译器 - 还是不允许这样做?您是否考虑过不使用-Wall 进行编译?如果您无法修改代码,那么查看警告就没有任何好处,因为您将无法对它们做任何事情。此外,这是一个警告;这是可以忽略的——你为什么不忽略它?
【解决方案2】:

修复此警告的选项:

  1. 删除始终为真的条件

  2. 最佳: 删除始终为真的条件 + 添加 static_assert 以确保类型是无符号的。 (对于 C 版本的 static_assert 看here

  3. 对于 gcc 4.3 之前的版本:删除编译器选项:-Wextra

  4. 对于 gcc 4.3+ 添加选项:-Wno-type-limits

【讨论】:

    【解决方案3】:

    根据源代码的年龄,在编译器不像现在 gcc 那样类型安全的时代,它可以以防御性的方式编写。

    警告看起来像是 -Wextra(又名 -W)警告选项集的一部分,所以如果您想要额外的警告,那将是其中之一。我个人使用-Wall,信不信由你不包括“额外”的东西。你会认为“全部”会包括“额外”,但我猜不是......

    【讨论】:

    【解决方案4】:

    比较中使用的变量被声明为 8 位无符号整数。当我将其更改为 32 位无符号时,警告被删除。 老的: uint8_t 变量 = 0; 使固定: uint32_t 变量 = 0;

    【讨论】:

    • 问题是你的 uint32_t 是如何定义的?使用 stdint.h 中的 uint32_t 不太可能有帮助,因为 uint32_t 和 uint8_t 一样是无符号的。
    猜你喜欢
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多