静态分析无法捕获的问题子集是什么?

mer*_*011 6 security static-analysis dynamic-analysis

我试图理解静态分析和动态分析之间的差异,以便程序流程执行,检测安全漏洞.

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

但是,静态分析似乎是所有可能的程序状态的原因,所以我无法想象静态分析可能会失败的情况,即使我确信这样的情况确实存在.我所看到的大多数参考文献似乎都模糊地说"抽象状态分析"并不像动态分析所能提供的那样精确,但这对我来说太过蓬松.

任何人都可以用静态分析失败的地方和需要动态分析的具体例子提供简单的解释吗?

gsn*_*ers 1

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

\n\n

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

\n\n

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

\n