9.1 静态分析

9.1 静态分析

静态分析通过分析代码本身,检查程序所有可能执行的路径,收集不论程序按哪条路径执行总是为真的信息。这使它与动态分析迥然不同,后者只是通过运行程序并输入一定数据来收集有关信息的。

在决定使用哪种静态分析算法时,你将不得不在所收集信息的精确性和性能开销(算法的复杂度以及运行时的开销)之间作出选择。比如稍后我们会介绍一些流不敏感(执行时忽略所有循环和条件语句)的别名分析算法,这些算法收集的信息相对不是很精确,但是它们运行速度很快。与其相对的还有一些流敏感(执行时会将考虑所有分支)的算法,它们收集的信息更精确,但执行速度自然也会慢不少。

本书中介绍的算法是通过程序转换的方式来保护软件的,这类转换中都需要执行某种静态分析。可是静态分析的结果可能会不够精确,而转换本身却必须是保守的或安全的。换句话说,只有当静态收集的信息足以保证转换能保持语义不变(即转换前和转换后,程序的行为是一致的)时,才能进行程序转换。在实践中,你可能会遇到这种情况:你打算用某个软件保护技术加固代码,但在执行时程序却会报错,以至于无法把相关技术应用到代码中。究其原因很可能就是静态分析收集到的信息还不够精确,无法保证转换的安全性。

许多分析方法都是从函数的控制流图出发的,所以我们把控制流图视为更进一步分析的基础。如本节中介绍的识别循环、到达定值、数据依赖关系(分析数据依赖关系是为了确定指定的两条语句相互之间是否有依赖关系,它们的位置能否互换)等分析方法都属于这类分析方法。