软件分析-IR
中间表示
编译过程
源代码
|词法分析
生成tokens
|语法分析
AST抽象语法树
|语义分析(类型检查之类的,编译器做的比较简单)
修饰后的AST语法树
|转换器
IR(可以进行静态分析)
|生成器
机器码
AST vs IR
AST
将代码拆解成树形
- 可以快速进行类型检查
- 看不出控制流信息
IR(静态分析适用)– 3-Address Code
将代码拆解成一行一行的,同时用到goto
- 控制流信息比较明显
- 较清晰
三地址码:每个三地址码最多包含3哥地址
地址形式
- 变量名
- 常量
- 编译器生成的静态变量
三地址码
常见符号
- 二元操作符
- 一元操作符
- goto L 无条件跳转
- if … goto L 有条件跳转
真实世界中的3地址码
Soot:分析java程序对静态分析器
Jimple:Soot的三地址码
Jimple
例子
java源码
1 | public class ForLoop3AC{ |
Basic Blocks
基本块中限定了进入语句和离开语句(跳转),
- 入口语句可以是顺序执行时选定的,也可以是其他语句goto过来的
分割算法
入口
- 第一句指令
- 如果某个指令是goto语句的target,则肯定是baseblock的入口
- 紧跟在一个goto语句的下一条
出口
- 如果某个指令中含有goto,则为bb的出口
- return
添边
goto自动加边,如果是紧跟着的两个块之间(可能前一个块的最后一句是有条件goto),也要添边
例外:如果前一块最后一句是无条件goto,那就不需要添边
前驱->后继
bb之间连完,一般会加一个entry虚拟节点、exit虚拟节点
- 标题: 软件分析-IR
- 作者: Sl0th
- 创建于 : 2023-09-07 18:32:34
- 更新于 : 2024-07-17 18:40:12
- 链接: http://sl0th.top/2023/09/07/软件分析-IR/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论