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 型と定義されました。