我很久以前获得了ISTQB认证,我记得它做出了以下区分:
- 静态分析:对源代码执行,检测无法到达的代码、未分配的值等。
- 动态分析:可以检测内存泄漏等,需要执行(剖析)。
但是当我今天搜索时,我看到各种网站和来源都提到静态分析也能检测内存泄漏。
所以我想知道,静态分析真的有这个能力吗?如果确实如此,在结果方面与动态分析有何不同呢?
我很久以前获得了ISTQB认证,我记得它做出了以下区分:
- 静态分析:对源代码执行,检测无法到达的代码、未分配的值等。
- 动态分析:可以检测内存泄漏等,需要执行(剖析)。
但是当我今天搜索时,我看到各种网站和来源都提到静态分析也能检测内存泄漏。
所以我想知道,静态分析真的有这个能力吗?如果确实如此,在结果方面与动态分析有何不同呢?
我相信静态分析工具能够捕捉到以下问题:
void MyFunction()
{
char * leakable = new char[1000];
}
所以,对于你的问题,答案显然是“是”。
更有趣的问题是它是否能捕捉到更微妙的泄漏。如果静态分析器可以访问所有涉及的源代码或方法的合同
表示(即:如果注释说:“调用者负责释放返回的对象”,则静态分析器可能无法捕获,但如果相同的概念在代码中表达(或可以通过分析代码得出),静态分析器可以发现问题--有时候。
静态分析能够检测到可能导致内存泄漏的构造形式,但它无法在运行时检测到实际的内存泄漏,因为它从不检查代码库的执行。