6

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

4 に答える 4

9

unsigned値が負になることはありません — したがって、警告です。それは「ありそうにない」というよりも「不可能」です。

これは通常、コードに何らかのバグがあることを示しています。コードは、負の値を許可できる型を期待して書かれていますが、その型は負の値を許可していません。したがって、期待値の不一致が原因で、コードが誤動作する可能性は十分にあります。

一部のマシンでは、plain が署名され、他のマシンでは unsigned であることに注意してください(また、値の範囲がどちらか一方と重複していても、両方とcharは異なる型です)。signed charunsigned char

于 2013-03-14T00:21:46.127 に答える
4

この警告を修正するオプション:

  1. 常に真である条件を削除する

  2. 最良の方法:常に true である条件を削除 + static_assertを追加して、型が符号なしであることを確認します。(static_assert の C バージョンについては、こちらを参照してください)

  3. gcc 4.3 より前の場合: コンパイラ オプションを削除: -Wextra

  4. gcc 4.3+ の場合、オプションを追加: -Wno-type-limits

于 2014-10-10T07:32:26.907 に答える
2

ソース コードの古さによっては、コンパイラが現在の gcc ほどタイプ セーフではなかった時代に、防御的な方法で記述できた可能性があります。

警告は、-Wextra (別名 -W) 警告オプション セットの一部のように見えるため、追加の警告が必要な場合は、その 1 つになります。私は個人的に -Wall を使用していますが、信じられないかもしれませんが、「余分な」ものは含まれていません。「すべて」には「おまけ」も含まれると思うかもしれませんが、そうではありません...

于 2013-03-14T04:08:08.143 に答える
0

比較で使用される変数は、8 ビットの unsigned int として宣言されていました。32 ビットの unsigned に変更すると、警告が削除されました。旧: uint8_t 変数 = 0; 修正: uint32_t 変数 = 0;

于 2016-03-01T11:33:03.677 に答える