Coverity报STDIN解引用错误的C程序问题解决诉求
解决Coverity报"Dereferencing '_stdin()', which is known to be 'NULL'"错误的方法
我在C应用里尝试从用户读取单个字符作为命令(无需 sanitize),使用getchar()、fgetc(stdin)、scanf(...)这类函数时,Coverity分析(aggressiveness-level设为medium)会报错:Event dereference: Dereferencing "_stdin()", which is known to be "NULL"。我已经试过检查cAck是否为NULL、stdin是否为NULL,还用ferror(stdin)、EOF、feof(stdin)做验证,但Coverity还是报错。怎么修改下面的示例代码消除这个错误?
原代码:
char cAck; if( (cAck = fgetc(stdin)) != NULL) { // do something with cAck }
修正方案
- 核心错误纠正:
fgetc的返回值是int类型,它会返回字符的ASCII值(0-255)或者EOF(通常为-1的负数)。用char存储会导致EOF被截断(若char为无符号类型),且和NULL比较完全错误——NULL是空指针常量,和字符/整数返回值不属于同一类型。 - 正确代码写法:
int cAck; // 显式检查stdin有效性,消除Coverity对空指针的顾虑 if (stdin != NULL) { cAck = fgetc(stdin); // 验证读取结果:既不是EOF,也无IO错误 if (cAck != EOF && !ferror(stdin)) { char cmd = (char)cAck; // do something with cmd } } - 解决Coverity报错的原因:
- 显式添加
stdin != NULL的检查,直接回应静态分析工具对空指针解引用的担忧; - 用
int存储fgetc返回值,避免EOF截断问题,同时用正确的EOF替代NULL做比较; - 结合
ferror(stdin)确认IO操作无错误,让静态分析工具认可读取逻辑的安全性。
- 显式添加
内容的提问来源于stack exchange,提问作者Jegor
相关产品推荐
相关产品推荐

