NJU Static Analysis Notes(1)——Intermediate Representation
课程链接
本次课程主要内容
- Compilers and Static Analyzers
- AST vs. IR
- IR: Three-Address Code (3AC)
- 3AC in Real Static Analyzer
- Static Single Assignment (SSA)
- Basic Blocks (BB)
- Control Flow Graphs (CFG)
经典编译器的结构
注意静态分析的作用阶段
IR vs AST
为什么在静态分析中采用IR而不用AST,关于三地址码,不过多记录,与编译中的知识一致。
Soot软件
Soot是一个很受欢迎的Java静态分析framework GitHub地址。Soot 采用了一种叫做Jimple
的IR,是一种typed 3-address code。
一段Java代码的例子
需要了解一下对应的JVM中的调用方法(specialinvoke,virtualinvoke,staticinvoke,interfaceinvoke,dynamicinvoke)
$ 表示soot生成的临时变量。
Static Single Assignment (SSA)技术
作为了解即可
SSA的优势和劣势
控制流图(Control Flow Graph)分析
与编译中的概念一致,概览如下
很重要的一个点是基本块(Basic Block)的定义与划分算法
给出这样一段IR,分析基本块的思路很明显,针对带有goto的代码要做额外的审视
根据goto的性质,goto的目标地址肯定是一个basic block的leader;指令后面跟着goto的是一个leader。找到所有的leader,那么一个leader到另一个leader之间的
就属于是一个basic block。具体算法如下
在上文的IR中运行该算法,可以得到
在有了basic block以后,考虑画CFG的算法,很明显针对goto和本来就是顺序的语句可以得到:
因此上文的例子可以画出如下CFG,需要值得注意的就是无条件跳转: