6

我试图了解静态分析和动态分析之间的区别,以执行程序流,以检测安全漏洞。

很明显,动态分析的主要弱点是它无法探索程序可以进入的所有可能状态,因为它依赖于使用特定输入集实际运行程序。

但是,静态分析似乎可以推理所有可能的程序状态,因此我无法设想静态分析可能会失败的情况,即使我确信这种情况确实存在。我看过的大多数参考资料似乎都含糊地说“抽象状态分析”不如动态分析所能提供的精确,但这对我来说太蓬松了。

任何人都可以提供一个简单的解释,并提供静态分析失败和需要动态分析的具体示例吗?

4

1 回答 1

1

给定图灵完整输入格式(这包括几乎所有编程语言)的所有程序的静态分析永远不可能完成,因为通常无法确定一段代码是否曾经执行过:您无法确定代码之前是否停止— 即,完成执行(如果它进入无限循环,那么超出它的任何“问题”都是虚假的,因为它无法到达) — 称为停止问题的问题

但是,原则上,如果您还允许分析输出实际不存在的“问题”,则可以找到所有可能的问题。这几乎是所有静态分析工具所做的——大量的工程工作都花在了尽量减少它们报告的错误问题的数量上。

此外,值得注意的是,一些状态探索系统本质上确实为每个状态执行程序(如果状态变得等价,通常会停止新的探索)——然而,许多程序具有不切实际的大输入状态空间(考虑任何采用文本的程序)输入!)使他们几乎不可能完全探索所有状态。

于 2014-06-08T00:28:07.320 回答