cppcheck 检测到资源泄漏 - 误报?

Posted

技术标签:

【中文标题】cppcheck 检测到资源泄漏 - 误报?【英文标题】:cppcheck detects a resource leak - a false negative? 【发布时间】:2018-02-11 18:37:37 【问题描述】:

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 所必需的。 【参考方案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)绝对有效,只是我个人偏好更明确

以上是关于cppcheck 检测到资源泄漏 - 误报?的主要内容,如果未能解决你的问题,请参考以下文章

cppcheck 未检测到来自 epoll_create 的资源泄漏

CppCheck 未检测到内存泄漏

将堆指针传递给函数时,cppcheck 无法检测到泄漏?

c++代码检测工具

如何告诉 cppcheck 忽略某些错误?

cppcheck 报告误报