对数据流分析的 3 个解释:
- An analysis to figure out “how application-specific data flows through the Nodes (BBs/Statements) and Edges (control flow) of CFG (a program)?” 对于 application-specific data,对变量或表达式抽象表示;对 Nodes,由 transfer function 处理;对 Edges,由 control-flow handing 处理。设计数据流分析的 3 个关键要素:abstraction、transfer function、control-flow handing。
- 控制流分析即给每一个程序点一个控制流的值,该值表示在该点可分析到的所有可能结果的抽象表示。
- 控制流分析即在 safe-approximation 规则(may / must)**约束(语义,即 transfer function,与控制流信息(control-flow handing))**下,求解出每一个 statement 的 IN 和 OUT(语句的输入与输出)。
为什么在静态分析的时候,使用 IR 而非 AST 呢?
- AST 是 high-level 且接近语法结构的,而 IR 是 low-level 且接近机器代码的。
- AST 是依赖于语言的,IR 通常是独立于语言的:三地址码会被分析器重点关注,因为可以将各种前端语言统一翻译成同一种 IR 再加以优化。
- AST 适合快速类型检查,IR 的结构更加紧凑和统一:在 AST 中包含了很多非终结符所占用的结点(body, assign 等),而 IR 中不会需要到这些信息。
- AST 缺少控制流信息,IR 包含了控制流信息:AST 中只是有结点表明了这是一个 do-while 结构,但是无法看出控制流信息;而 IR 中的 goto 等信息可以轻易看出控制流。
如何构建一个基本块呢?
- 决定 P 的 leaders
- P 的第 1 条指令就是一个 leader
- 跳转的目标指令是一个 leader
- 跳转指令的后一条指令,也是一个 leader
- 构建 P 的基本块
- 一个基本块就是一个 leader 及其后续直到下一个 leader 前的所有指令
- 若 A -> B,则我们说 A 是 B 的前驱(predecessor),B 是 A 的后继(successor)
- 除了构建好的基本块,我们还会额外添加两个结点,「入口(Entry)」和「出口(Exit)」
- 这两个结点不对应任何 IR
- 入口有一条边指向 IR 中的第一条指令
- 如果一个基本块的最后一条指令让程序离开这段 IR,那么这个基本块就会有一条边指向出口