1. 什么是静态分析?静态分析的作用是什么?
所谓静态分析,是指在代码运行前所做的一系列检测,用于分析代码的可靠性、安全性和性能方面的需求。大部分编译的优化(如 O1、O3)都使用静态分析方法,或者用于理解程序时也会用到静态分析,这就是静态分析的作用。
2. 静态分析的应用有哪些?
静态分析可以用于检测:
- 私有信息是否泄漏
- 是否存在空指针问题
- 是否有死代码
然而,完美的静态分析是不存在的。
静态分析的完整程度可以用以下三个词来形容:
- Complete:程序报出的一些正确问题。
- Truth:程序报出所有正确的问题。
- Sound:程序报出的所有问题。
在静态分析中,妥协可能会导致漏报和误报。即便如此,宁可误报也不漏报。正确性、精度和速度之间需要进行权衡。
静态分析的步骤:
- 抽象
- 过度近似
在控制流中,汇聚的地方通常为 unknown。
3. 编译器和静态分析的关系是什么?
编译器的流程如下:
Source Code --> Scanner (lexical analysis, use Regular Expressions for Token)
--> Parser (Syntax Analysis, use Context-Free Grammar to AST)
--> Type Checker (use Attribute Grammar to Decorated AST)
--> Translation (to IR in Statics)
--> Code Generator
--> Machine Code
4. AST 与三地址码的区别
如图1所示,IR 与汇编语言非常接近。AST(抽象语法树)与编程语言紧密相关,而 IR(中间表示)与编程语言关系不大,而且IR 很简洁。
三地址码(3AC)每一句最多有一个符号(如变量名、常量或编译器生成的临时变量)。
5. 什么是 Soot?
Soot 是用于 Java 的静态分析框架,如图2所示。
方法签名:
类名: 返回类型 方法名(参数)
在 IR 中还有一种格式叫做 SSA(静态单赋值形式),在分析代码时,同一个变量会加上 p1、p2 等序号。