文章目录
Intermediate Representation
类似编译器会把 source code 转化成中间语言,静态程序分析器也需要一种表示形式,使得这种表示形式利于静态分析的进行。
IR有多种,并没有统一的标准。这里记录的是比较广泛的一种IR。
1. 编译器和静态分析器
编译器:source code 转换为机器码。
整体框架:

- 首先在 Scanner 利用 Regular Expression 进行词法分析。
- 比如图中 Youxxx 部分,由于有特殊符号,所以无法通过词法分析
- 词法分析通过后会生成一堆token,然后转交给Parser。
- parser 利用 Context-Free Grammar 进行语法分析
- 图中 Like your hair I 虽然每个单词都正确,但是不满足语法要求
- 这一步会生成AST
- 语义分析
- 图中 Apples eat you 虽然语法正确,但是语义却不对
- 对于编译器来说,这一步实际是进行一些类型检查。比如把 float 赋值给 int 等。之后生成 Decorated AST。
- 转换器转化为IR
- 一般是变成三地址码IR
- 静态分析,如代码优化,空指针分析,都是在IR阶段进行的。
- 生成机器码。
为什么使用上下文不敏感(Context-Free)
对于编程语言来说,上下文不敏感已经足够。上下文敏感分析主要用来分析自然语言,用来分析编程语言有些“杀鸡用牛刀”。
2. AST vs. IR

可以看到:

可以看到:
AST
- 是更高层次的抽象,更接近语法结构
- 通常依赖于编程语言
- 适用于快速的类型分析
- 缺少控制流信息
- 图中很难看出这是一个循环
3AC IR
- 通常是更底层的,更接近机器语言
- 通常不依赖于编程语言
- 可以将不同语言翻译成同一种表示格式
- 很统一和简洁
- do-while, assign 都没有了
- 包含循环信息
- 通常作为静态分析的基础
因为这些特性,所以三地址码形式的

博客介绍了编译器和静态分析器的工作流程,对比了AST和IR,着重讲解了三地址码(3AC)形式的IR,包括其定义、在静态分析中的应用(如Soot),还介绍了静态单赋值(SSA)和控制流分析(构建基本块和控制流图)等内容。
最低0.47元/天 解锁文章
646

被折叠的 条评论
为什么被折叠?



