CWARN.CMPCHR.EOF

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

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

脆弱性とリスク

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

脆弱コード例

コピー
 #include <stdio.h>
 
 void read_file(FILE *file) {
   char c;
   do {
     c = fgetc(file);
   } while(c != EOF);
 }

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

修正コード例

コピー
 #include <stdio.h>
 
 void read_file(FILE *file) {
   int c;    
   do {
     c = fgetc(file);
   } while(c != EOF);
 }

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