2013-03-14 41 views
4

我遇到從GCC 4.1.2以下警告:警告:比較總是假由於範圍有限的數據類型的在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

爲什麼不保留警告?也許源代碼的所有者需要看到它;也擺脫它可能掩蓋其他錯誤。 – wilsonmichaelpatrick 2013-03-14 00:18:48

+0

你是否堅持使用這段代碼?它是否生成代碼? – minopret 2013-03-14 00:25:37

+1

我認爲它是GCC,而不是GDB,會產生警告。 GDB版本4比GCC 4.1.2更古老(儘管GCC 4.1.2相當陳舊,可能大約在2006年)。 – 2013-03-14 00:32:03

回答

8

一個unsigned價值將永遠不會消極 - 因此警告。這不是'不可能'和'不可能'。

這通常表示在某種代碼中存在一個錯誤;代碼被寫爲期望可以允許負值的類型,但是該類型不允許負值。所以,由於預期的不匹配,代碼很可能會行爲不端。

注意,在某些機器上,平原char簽署和對他人的無符號(它是一種類型的從兩個signed charunsigned char不同,即使其值的範圍與重疊的一個或另一個)。

+1

你說的都是正確的。但是,它不能解決我的問題。 – user1783732 2013-03-14 17:42:41

+0

它是你的代碼還是別人的代碼?如果是你的代碼,在什麼情況下'count'是一個簽名數量?你可以使得'count'簽名的類型有條件嗎?如果是別人的代碼,你問過他們嗎?你是否考慮升級到更新的編譯器 - 或者這是不允許的?你有沒有考慮過編譯沒有'-Wall'?如果你不能修改代碼,看到警告是沒有好處的,因爲你無法對它們做任何事情。另外,這是一個警告;它是可以忽略的 - 爲什麼你不忽略它? – 2013-03-14 18:55:10

2

根據源代碼的年齡大小,它可以用防禦的方式編寫,因爲編譯器現在不像gcc那樣類型安全。

警告看起來像是-Wextra(aka -W)警告選項集的一部分,所以如果您想要額外的警告,那將是其中之一。我個人使用-Wall,它相信與否不包括「額外」的東西。你可能會認爲,「所有」將包括「額外」的,但我不這樣想......

+0

這不是「-Wextra」。我使用的選項是「-Wall」,不幸的是;-)。 – user1783732 2013-03-14 17:42:06

+0

@ user1783732此警告是根據文檔-Wextra的一部分:https://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Warning-Options.html – Speakus 2014-10-09 16:32:25

0

選項來解決此警告:

  1. 刪除條件,其送花兒給人真正

  2. 最好:除去真正的條件+添加static_assert以確保類型無符號。 (對於C版本static_assert看起來here

  3. 對於GCC之前4.3:刪除編譯選項:-Wextra

  4. gcc的4.3+添加選項:-Wno型限制

0

比較中使用的變量被聲明爲8位無符號整數。當我將其更改爲32位無符號整數時,警告被刪除。舊版: uint8_t變量= 0; 修復: uint32_t變量= 0;

相關問題