warning: comparison is always true due to limited range of data type
警告:データ型の幅が限られているため、比較は常に真である。
[-Wtype-limits]
■1.降順ループで符号無し変数を使うと無限ループ
#include <stdio.h>
typedef unsigned char U1;
static void f1(void)
{
//NG:降順のループカウンタに符号無し変数は危険
for(U1 i = 10 ; i >= 0 ; i--){
printf("無限ループする %d\n",i);
}
}
符号無し変数は負値にならないので常に0以上です。
for文の第2条件が常に成り立つので
無限ループの危険があります。
符号無し変数以外のループカウンタを使用を禁止にしているプロジェクトでこの問題はよく発生するので、
ルールの見直しを推奨します。
■2.ループカウンタに狭い型を使うと無限ループ
typedef unsigned char U1;
static void f2(void)
{
//NG:U1型は256を表現できない
for(U1 i = 0 ; i < 256 ; i++){
printf("無限ループする %d\n",i);
}
}
U1型では255までしか表現できないので256になる事はなく
無限ループします。
この問題はメモリ節約のためと称して狭い型(char/short)を多用するプロジェクトでよく発生します。
ループカウンタには整数を扱うのに適した int 型を使用する事を推奨します。
■3.ループカウンタが最大値の型より狭いと無限ループ
typedef unsigned char U1;
static void f3(int max)
{
for(U1 i = 0 ; i < max ; i++){
printf("無限ループする %d\n",i);
}
}
int main(void)
{
f3(1024);
}
for文第2式の i < max において、
i は U1 型で255までしか表現できないのに対して、
max は int 型で2147483647(32bit CPUの場合)まで表現できるので
このコードの場合無限ループしますが、
残念ながら現状 gcc/clangで問題検出できません。
■4.アンケート