6

我遇到了来自 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"

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

4

4 回答 4

9

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

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

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

于 2013-03-14T00:21:46.127 回答
4

options to fix this warning:

  1. remove condition which alway true

  2. best: remove condition which alway true + add static_assert to ensure type is unsigned. (for C version of static_assert look here)

  3. for gcc prior 4.3: remove compiler option: -Wextra

  4. for gcc 4.3+ add option: -Wno-type-limits

于 2014-10-10T07:32:26.907 回答
2

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

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

于 2013-03-14T04:08:08.143 回答
0

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

于 2016-03-01T11:33:03.677 回答