南大《软件分析》2.0 IR

南大《软件分析》2.0 IR

henry Lv4

课程环境:https://tai-e.pascal-lab.net/lectures.html

课程视频:https://www.bilibili.com/video/BV1b7411K7P4

南大《软件分析》2.0 IR

IR 即 Intermediate Representation,是一种中间语言表示,通常代码在经过编译器前端之后会转化成 IR 的形式来帮助后端进行优化。

nipaste_2024-07-31_19-47-4

这一部分展示了,从源码到最后机器码的过程,涉及到了一些编译原理的知识,不过没有相关编译知识也不用太过担心,只需要熟悉这张图的流程,并且明白通常我们在静态分析的过程是在 IR 这一步就可以了,如果对 IR 理解有困难可以参考我之前关于 llvm IR 的介绍 ,理解它是个什么东西就行了。

nipaste_2024-07-31_19-52-4

这一部分给出了为什么我们静态分析要从 IR 开始,而不是从 AST(抽象语法树)来进行分析,对上面的内容简单翻译之后就是:

AST

  • 更接近目标语言的语法结构
  • 依赖目标语言
  • 适合快速类型检查
  • 缺少控制流信息

IR

  • 更接近机器码的低级表达
  • 不依赖原始语言
  • 紧凑和统一的
  • 包含控制流信息
  • 被认为是静态分析的基础

可以这样想,因为静态分析的目的就是找出那些程序执行时可能出现的一些行为,显然像上图那样的 AST 对于理解程序执行情况是帮助不大的,反而 IR 这种简单的指令形式可以极大的来帮助我们理解程序,并检测其行为。

3-Address Code (3AC)

3AC 是一个概念,即三地址码,实际上是用来更加简化每条指令提出的一种形式,它要求在每条指令的右侧最多只有一个操作符

1
2
3
4
5
//不属于三地址码
c = a+b+3
//经过优化后的三地址码
t1=a+b //满足
c =t1+3 //满足

![img](file:///E:/ctf/static_analysis/img/Snipaste_2024-07-31_20-03-59.png?lastModify=1722427446)nipaste_2024-07-31_20-03-5

上图归纳了三地址码中的地址具体指:变量名常量,编译器生成的临时变量

老师还讲了一些从源码到对应到3AC的一些实际的案例,能看懂理解即可。

SSA

SSA(static single assignment) 即静态单一赋值,即SSA中每个变量只能被定义一次,通俗来讲一个变量只能出现在等号左边一次,不能出现两次及以上。

nipaste_2024-07-31_20-16-2

SSA 优缺点总结如下:

优点:

  • 执行流信息被间接传递到变量名
  • 定义和使用是明确的

缺点:

  • 会引入大量变量和φ函数
  • 转化为机器码的效率降低

能理解它是个啥玩意就行,不是课程重点。

Control Flow Analysis

Control Flow Analysis 通常指建立控制流图(CFG),比如说下图就是一个将3AC程序转化为CFG的一个过程。

nipaste_2024-07-31_20-22-1

从控制流图中我们需要关注的一个东西就是基本块(basic block),即上边右图中各个小的代码块。

满足以下两个性质的连续指令称为一个基本块

  • 只能由第一条指令作为基本块入口
  • 只能由最后一条指令作为基本块出口

nipaste_2024-07-31_20-26-2

根据程序划分基本块的算法也很简单,用文字描述就是(这里把每个基本块的入口指令称为 leader):

  • 只需要找到各个基本块入口的 leader(对应前面的图下面的例子并不唯一)
    • 程序的第一条指令是一个 leader:x = input
    • 无条件(goto)或条件 goto 的目标指令是一个 leader:z=x*y
    • 无条件(goto)或条件 goto 指令的下一条指令是一个 leader:p = x/y
  • 以前面找到的各个 leader 对源程序进行切分,每个块就是一个基本块

可以结合下面的图来理解上面的算法思想。

nipaste_2024-07-31_20-33-0

那有了基本块之后还要思考怎么构造连接基本块之间的边,当然这个算法就更简单了:

  • 基本块A到基本块B之间存在无条件(goto)或条件 goto 时添加边
  • 基本块B 紧接在基本块A之后(按指令顺序,A执行完的下一条指令属于B)且基本块A不以无条件goto结束

nipaste_2024-07-31_20-38-5

理解起来实际上就对应上图中的内容,通过在实际过程中可能还会加入一个 entry 和 exit 两个块,因为程序毕竟总有开始和结束嘛。

思考题

nipaste_2024-07-31_20-41-1

相信有了前面的内容了解之后,理解这些问题并不难

  • Title: 南大《软件分析》2.0 IR
  • Author: henry
  • Created at : 2024-07-31 20:42:53
  • Updated at : 2024-07-31 20:47:26
  • Link: https://henrymartin262.github.io/2024/07/31/2.0_IR/
  • License: This work is licensed under CC BY-NC-SA 4.0.
 Comments