gcc 4.4.5と-Wtype-limits
オプションをオンにして小さなコード スニペットをテストしています。
#include <assert.h>
#include <limits.h>
#include <stdint.h>
int main(void)
{
/* With other values of v, the behavior of the compiler is the same. */
uint16_t v = 0;
assert((unsigned int)INT_MAX < (unsigned int)v); /* l. 7 */
return 0;
}
次に、コンパイラは次の警告をスローします。
main.c:7: warning: comparison is always false due to limited range of data type
ただし、私の知る限り、( C11 (n1570) から、§ 5.2.4.2.1 整数型のサイズ)INT_MAX
と等しい可能性があります。その場合、変数は値を保持でき、 の式は に評価されます。+32767
<limits.h>
v
INT_MAX+1
assert
1
したがって、次の 2 つの問題があります。
- GCC は私のアーキテクチャを考慮に入れています。実際に
INT_MAX
は と等しくないから+32767
です。その場合、-Wtype-limits
私にとってのメリットが減少します。 - バグです。
2 番目のオプションについて考えさせられるのは、同じオプションで警告を生成しない次のコードです。
#include <assert.h>
#include <limits.h>
#include <stdint.h>
int main(void)
{
assert((unsigned int)INT_MAX < (unsigned int)UINT16_MAX);
return 0;
}
それで、正しい答えは何ですか?
PS:ところで、gccのバージョンが古いため、申し訳ありません。おそらく、次のリリースの動作は異なるでしょう。