【问题标题】:cppcheck detects a resource leak - a false negative?cppcheck 检测到资源泄漏 - 误报?
【发布时间】:2026-01-24 17:25:01
【问题描述】:

cppcheck 在下面的代码中检测到资源泄漏。 我认为这是一个假阴性。 如果不是,你能解释一下为什么是资源泄漏吗?

bool fileExists(const char* filename)
{
    FILE* fp = fopen(filename, "r");
    bool result = (fp != NULL);
    if (result) fclose(fp);
    return result; // <-- (cppcheck error) Resource leak: fp
}

【问题讨论】:

  • 如果您将if (result) 替换为if (fp != NULL),是否还会报告资源泄漏?
  • 这样写会怎样:FILE *fp; if ((fp = fopen(filename, "r")) == NULL) {return false;} fclose(fp); return true;
  • 与问题无关,但fopen(filename, "r") 也可以 - 在某些系统上 - 如果filename 可以写入或存在但受到保护以避免打开,则返回NULL。这无法在标准 C 中处理——这是使用系统特定 API 所必需的。

标签: c c99 cppcheck


【解决方案1】:

是的,它是假阴性,当fp 没有关闭时,cppcheck 错误地检测到一个理论上可能的分支

我会亲自将这段代码重写为:

FILE* fp = fopen(filename, "r");
if (fp != NULL) {
    fclose(fp);
    return true;
}
return false;

【讨论】:

  • 更好:if(fp) {...}
  • @machine_1 这是否更好还有待商榷。
  • @machine_1 你说得对,使用if(fp)绝对有效,只是我个人偏好更明确