软件分析-IR

Sl0th Lv4

中间表示

编译过程

源代码

|词法分析

生成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
2
3
4
5
6
7
8
public class ForLoop3AC{
public static void main(String[] args){
int x=0;
for(int i=0;i<10;i++){
x=x+1;
}
}
}

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 进行许可。
评论