NJU软件分析笔记(1)

NJU Static Analysis Notes(1)——Intermediate Representation

课程链接
本次课程主要内容

  1. Compilers and Static Analyzers
  2. AST vs. IR
  3. IR: Three-Address Code (3AC)
  4. 3AC in Real Static Analyzer
  5. Static Single Assignment (SSA)
  6. Basic Blocks (BB)
  7. 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,需要值得注意的就是无条件跳转:

总结

posted @ 2022-04-26 16:16  OasisYang  阅读(221)  评论(0编辑  收藏  举报