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 类型。