EN JP CN

CWARN.CMPCHR.EOF

CWARN.CMPCHR.EOF

char 式が EOF 定数と比較されます

CWARN.CMPCHR.EOF チェッカーは、char 式が EOF 定数と比較されるインスタンスにフラグを立てます。

脆弱性とリスク

getchar、fgetc、getc などのファイルから単一の文字を読み取る関数は、通常、EOF 戻り値 (32 ビットプラットフォームでは 0xffffffff) を値が -1 (0x000000ff) に等しい読み取りバイトと区別するために、int 値を返します。このため、char 型の変数を EOF 定数と比較する場合にミスを起こしやすくなります。そうではなく、int 変数を使用する必要があります。

脆弱コード例

01 #include <stdio.h>
02 
03 void read_file(FILE *file) {
04   char c;
05   do {
06     c = fgetc(file);
07   } while(c != EOF);
08 }

Klocwork 6 行目の char 変数 'c' とEOF 戻り変数の比較の試行にフラグを立てます。

修正コード例

01 #include <stdio.h>
02 
03 void read_file(FILE *file) {
04   int c;    
05   do {
06     c = fgetc(file);
07   } while(c != EOF);
08 }

修正例では、変数 'c' は正しく int 型と定義されました。