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 检测到资源泄漏 - 误报?的主要内容,如果未能解决你的问题,请参考以下文章