静态分析能够检测内存泄漏吗?

13

我很久以前获得了ISTQB认证,我记得它做出了以下区分:
- 静态分析:对源代码执行,检测无法到达的代码、未分配的值等。
- 动态分析:可以检测内存泄漏等,需要执行(剖析)。

但是当我今天搜索时,我看到各种网站和来源都提到静态分析也能检测内存泄漏。

所以我想知道,静态分析真的有这个能力吗?如果确实如此,在结果方面与动态分析有何不同呢?

4个回答

14
作为静态分析器的开发人员之一,我可以说,寻找内存泄漏问题对于SCA来说是一个极其复杂且有时不可能的任务。静态分析器在这个领域确实很弱,我们不应该对它们抱有太多期望。相比之下,动态分析器在寻找内存泄漏方面要强得多,如果有任务需要找到内存泄漏,那么你应该考虑使用动态而不是静态分析。
是的,静态分析器能够找到简单的内存泄漏情况。但在实践中,当代码变得复杂并且内存在程序的不同部分被释放/分配时,你会遇到大量的内存泄漏情况。因此,静态分析实际上并不是非常有效。

11
一个设计良好/实施良好的静态分析工具可以通过分析代码来检测出许多代码必然存在内存泄漏的情况。像Coverity/Prevent这样的工具在这方面表现得相当出色。
这类工具还可以检测出许多可能存在内存泄漏的情况(由于图灵陷阱的存在,无法确定是否真的存在内存泄漏)。关于这些情况,是否应该由工具报告存在着很大的争议,因为它们可能是误报,而误报会浪费程序员的时间。更糟糕的是,如果程序员在处理多个误报时浪费了时间,往往会完全停止使用该工具,这样即使真正发现的错误也会失去其价值。
动态分析工具通常可以在运行时发生内存泄漏时立即检测到(比如一个指向堆的指针被保存在一个局部变量中,而该局部变量超出了其作用域)。(请参考我们的CheckPointer工具,它是一种动态分析工具,可以在运行时检测到几乎每个堆栈/堆分配/指针误用错误)。

3

我相信静态分析工具能够捕捉到以下问题:

void MyFunction()
{
    char * leakable = new char[1000];
}

所以,对于你的问题,答案显然是“是”。

更有趣的问题是它是否能捕捉到更微妙的泄漏。如果静态分析器可以访问所有涉及的源代码或方法的合同表示(即:如果注释说:“调用者负责释放返回的对象”,则静态分析器可能无法捕获,但如果相同的概念在代码中表达(或可以通过分析代码得出),静态分析器可以发现问题--有时候。


0

静态分析能够检测到可能导致内存泄漏的构造形式,但它无法在运行时检测到实际的内存泄漏,因为它从不检查代码库的执行。


当然可以。你的程序包含“malloc(1276)”语句,但是该指针从未被使用,这就是一个内存泄漏。静态分析工具可以检测到许多这样的情况。但是静态分析工具无法检测到所有的内存泄漏。 - Ira Baxter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接