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