【静态分析】静态分析笔记02 - Intermediate Representation

参考:

[南京大学]-[软件分析]课程学习笔记(二)-IR_ast和ir的区别-CSDN博客

------------------------------------------------------------------------------------------------------------

1. compilers and static analyzers

compiler 是将 Source Code 转换成 Machine Code,中间过程如下:

为什么不直接拿 source code 做静态分析?

因为首先要确保这是一份合格的代码,词法正确,语法正确,语义正确,而后再进行分析 non-trivial 的一些属性,而不是在可能编译不通过,运行不起来的程序中去分析这些 trivial 属性。

PS:这里可能还是需要看应用场景,应用场景不同,其需求不同,source code 有时确实会比 IR 或者 machine code 表达出更丰富的语义。在OSS重用,代码相似性的 field 中,确实存在若干 paper 基于 source code 构建代码相似性。

2. AST vs IR

  • 抽象语法树是 high-level,且比较接近语法结构的,而 IR 是 low-level 且接近机器代码的
  • AST 依赖于语言,而 IR 通常独立于语言
  • AST 适合快速类型检查,而 IR 的结构更加紧凑和统一
  • AST 缺少控制流信息,而 IR 包含了控制流信息

可以看到 IR 和 AST 相比,IR阶段是更适合进行静态分析的阶段。

3. IR: three-address code (3AC)

每条指令右边最多有一个操作符。

每当出现多个操作符,可以通过引入临时变量来解决。

为什么叫3地址码呢?因为最多可以包含3个地址,地址可以是以下三种形式:

  • Name: a, b
  • Constant: 3
  • Compiler-generated temporary: t1, t2

4. 3ac in real static analyzer: Soot

5. Static Single Assignment(SSA)

静态单一赋值:

  • 每个变量都有自己的定义
  • 不同的控制流汇入一个块中,则会导致多个变量备选,因此 merge 时引入 phi-function

Why SSA:

  • 流信息会间接的引入到独特的变量名称中;对流不敏感的分析可能会得到流敏感分析的一些精度;
  • Define-and-use 是显示的,在一些按需任务中可以更有效的存储和传播数据事实;一些优化器任务在SSA上表现的更好,例如条件变量传播,全局变量计数等

Why not SSA:

  • 会引入太多变量;
  • 转换为机器码时会带来性能问题;

6. Basic blocks(BB)

一个 BB 中尽可能含有多的序列

  • BB 入口只能是第一条指令
  • BB 出口只能是最后一条指令

BB 入口唯一,出口也唯一

3AC -> BB:

  1. 决定 BB 的起始指令:
    1. 程序的第一条指令为一个起始指令;
    2. 任何条件跳转或者非条件跳转的目标指令是一个起始指令;
    3. 任何跳转指令的下一条指令为一个起始指令;
  2. 建立程序 P 的 BB:
    1. 一个基本块包含一条起始指令和直到下一条起始指令的所有指令序列

7. Control Flow Graphs(CFG)

7.1 CFG的节点就是BB;
7.2 block A 和 block B之间有边,条件是:

    条件跳转和非条件跳转从 A 的结尾到 B 的开头
    在原始指令顺序中,B 紧接着 A(无条件goto不可以 )

7.3 用跳转到基本块来代替跳转到指令;
7.4 添加 Entry 和 Exit,Entry 连接第一个BB,Exit 连接最后一个BB;

  • 26
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值