You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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报错的原因:
    1. 显式添加stdin != NULL的检查,直接回应静态分析工具对空指针解引用的担忧;
    2. 用int存储fgetc返回值,避免EOF截断问题,同时用正确的EOF替代NULL做比较;
    3. 结合ferror(stdin)确认IO操作无错误,让静态分析工具认可读取逻辑的安全性。

内容的提问来源于stack exchange,提问作者Jegor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:15:40