静态分析可以检测内存泄漏吗?

问题描述 投票:0回答:4

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

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

所以我想知道,静态分析真的有能力做到这一点吗?如果是这样,那么动态分析在结果方面有什么不同?

testing memory-leaks code-analysis static-analysis
4个回答
14
投票

作为静态分析器的开发人员之一,我可以说,搜索内存泄漏问题对于 SCA 来说是一项极其复杂、有时甚至是不可能的任务。静态分析器在这个领域确实很弱,我们不应该对它们抱有太多期望。动态分析器在搜索内存泄漏方面要强大得多,如果有任务要查找它们,那么您应该考虑动态分析,而不是静态分析。

是的,静态分析器能够发现简单的内存泄漏情况。但实际上,当代码很复杂并且内存在程序的不同部分中被释放/分配时,就会出现内存泄漏。因此,静态分析确实效率不高。


11
投票

精心设计/实现的静态分析工具可以仅通过分析代码来检测某些代码“必须”存在泄漏的许多情况。像 Coverity/Prevent 这样的工具就可以很好地做到这一点。 此类工具还可以检测许多“可能”存在泄漏的情况(而图灵防水油坑会阻止它确定)。关于该工具是否应该报告这些存在很大的争议,因为它们可能是误报,而误报是浪费程序员的时间。 [更糟糕的是:如果程序员将时间浪费在几个误报上,他/她通常会完全放弃使用该工具,现在甚至连真正检测到的错误的价值也会丢失]。

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

我很确定静态分析器可以捕获:


3
投票

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

一个更有趣的问题是它能否捕获更细微的泄漏。如果它可以访问所涉及的所有源代码或所涉及方法的 
contract

表示(即:如果注释说:调用者负责释放返回的对象”,那么答案是“通常是”),那么静态分析器可能无法捕获它,但如果相同的概念用代码表达(或者可以通过分析代码得出),静态分析器有时可以找到问题。

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


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.