警告:由于gcc 4.1.2中数据类型的范围有限,因此比较始终为false

时间:2013-03-14 00:15:09

标签: c linux gcc

我在gcc 4.1.2中遇到以下警告:

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

有关的C代码如下:

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

其中'count'是无符号的。

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

-Wno-type-limits

但似乎gcc 4.1.2不支持它。

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

还有其他方法可以摆脱这种警告吗?

4 个答案:

答案 0 :(得分:8)

unsigned值永远不会为负 - 因此警告。它并不像“不可能”那样“不太可能”。

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

请注意,在某些计算机上,普通char已签名而其他计划未签名(并且它的类型与signed charunsigned char不同,即使其值范围与1重叠或者其他)。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

修复此警告的选项:

  1. 删除条件,总是如此

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

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

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

答案 3 :(得分:0)

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