CWARN.CMPCHR.EOF
字符表达式与 EOF 常量进行比较
CWARN.CMPCHR.EOF 检查器会标记字符表达式与 EOF 常量进行比较的实例。
漏洞与风险
通常,用于从一个文件读取单个字符的函数(getchar、fgetc 和 getc)会返回 int 值,以区分 EOF 返回值(在 32 位平台上为 0xffffffff)和值等于 -1 (0x000000ff) 的读取字节。因此,char 类型的变量与 EOF 常量进行比较通常会导致错误,应该使用 int 变量进行比较。
漏洞代码示例
复制
#include <stdio.h>
void read_file(FILE *file) {
char c;
do {
c = fgetc(file);
} while(c != EOF);
}
Klocwork 在第 6 行标记了将字符变量 c 与 EOF 返回变量进行比较的尝试。
修正代码示例
复制
#include <stdio.h>
void read_file(FILE *file) {
int c;
do {
c = fgetc(file);
} while(c != EOF);
}
在该修正代码示例中,变量“c”已正确定义为 int 类型。