我在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"
还有其他方法可以摆脱这种警告吗?
答案 0 :(得分:8)
unsigned
值永远不会为负 - 因此警告。它并不像“不可能”那样“不太可能”。
这通常表明某种代码中存在错误;编写的代码期望一个可以允许负值的类型,但该类型不允许负值。因此,由于期望不匹配,代码很可能会出错。
请注意,在某些计算机上,普通char
已签名而其他计划未签名(并且它的类型与signed char
和unsigned char
不同,即使其值范围与1重叠或者其他)。
答案 1 :(得分:2)
根据源代码的年龄,它可以以防御方式编写,编译器不像gcc现在那样类型安全。
警告看起来像是-Wextra(又名-W)警告选项集的一部分,所以如果你想要额外的警告,那将是其中之一。我个人使用-Wall,它相信与否不包括“额外”的东西。你会认为“所有”将包括“额外”但我猜不是......
答案 2 :(得分:2)
修复此警告的选项:
删除条件,总是如此
最佳:删除条件,其中始终为真+添加static_assert以确保类型为无符号。 (对于C版本的static_assert外观here)
对于gcc之前的4.3:删除编译器选项:-Wextra
用于gcc 4.3+添加选项:-Wno-type-limits
答案 3 :(得分:0)
比较中使用的变量被声明为8位无符号int。当我将其更改为32位无符号时,警告被删除。 旧: uint8_t变量= 0; 固定: uint32_t variable = 0;