静态分析能否检测到内存泄漏?

时间:2016-05-09 15:13:15

标签: testing memory-leaks code-analysis static-analysis

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

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

所以我想知道,静态分析真的有能力吗?如果是这样,那么动态分析与结果有什么不同呢?

4 个答案:

答案 0 :(得分:6)

一个设计良好/实现的静态分析工具可以通过分析代码来检测许多代码必须泄漏的情况。像Coverity / Prevent这样的工具做得非常好。

此类工具还可以检测到可能是泄漏的许多情况(并且Turing tarpit阻止它确定)。关于该工具是否应该报告这些,存在一个巨大的争论,因为它们可能是误报,误报是浪费程序员的时间。 [更糟糕的是:如果一个程序员浪费时间在几个误报上,他/她经常完全退出使用该工具,现在甚至真正检测到的错误的价值都会丢失]。

动态分析工具通常可以判断是否在运行时发生泄漏。 (想象一下指向堆的指针保存在局部变量中,并且该局部变量超出范围)。 (请参阅我们的CheckPointer工具获取动态分析工具,该工具几乎可以检测运行时遇到的每个堆栈/堆分配/指针误用错误。

答案 1 :(得分:6)

作为静态分析器的开发人员之一,我可以说,搜索内存泄漏的问题对于SCA来说是一个极其复杂且有时不可能完成的任务。静态分析仪在这方面确实很弱,我们不应期待它们。动态分析器在搜索内存泄漏方面要强得多,如果有任务要找到它们,那么你应该考虑动态分析而不是静态分析。

是的,静态分析器能够找到内存泄漏的简单案例。但实际上,当代码很复杂并且内存在程序的不同部分中空闲/分配时,内存泄漏很多。因此,静态分析确实不是很有效。

答案 2 :(得分:1)

我非常确定静态分析仪可以捕获:

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

所以,你的问题的答案显而易见"是"。

一个更有趣的问题是它能否捕捉到更微妙的泄漏。答案就是"经常是"如果它可以访问所涉及的所有源代码或所涉及方法的contract表示(即:如果注释说明:调用者负责释放返回的对象",那么静态分析器可能没有捕捉它,但如果在代码中表达相同的概念(或者可以通过分析代码得出),静态分析器可以找到问题 - 有时候。

答案 3 :(得分:-1)

静态分析能够以构造的形式检测内存泄漏的可能性,该构造可能会导致内存泄漏。但是,它不能检测运行时是否存在实际的内存泄漏,因为它从未检查过代码库的执行情况。