阅读 80

框架柱核心区,静态代理核心类

2. Soot核Body Body对应于Java的一个函数体,Body是Soot的核,Graph、Flow的构造都基于Body进行分析。 当然,不同的Body可以基于不同的IR语言构建。 Soot提供了JimpleBody、ShimpleBody、grimplebody

Soot提供ShimpleBody和JimpleBody的相互转换

然后从JimpleBody到GrimpBody的变换

2.1 Trap Trap经常与Java字节码异常表相对应

以Jimple为例进行说明

2.2本地:本地对应于Java字节码的本地函数

2.2.1 IR的Jimple

从上面的例子中我们可以看到Jimple的一些语言特征:

堆栈基于java语言的字节码表示原本是堆栈,正如Dalvik是基于寄存器的一样,Jimple是基于堆栈的

2 .有类型

每个参数定义一个Type,类型精度如int $i0不会丢失

3.3基于地址分析

三地址分析中会出现很多中间变量

三个地址同时分解一些高级特性,分解为多个单位,包含一些低级操作,支持低级指令

一般来说,三地址码包含大多数低级操作,即目标计算机支持的命令。

举个例子:

int i,j; i=2; j=2*i 8;

如下所示。

int i,j,temp$0,temp$1,temp$2,temp$3;

temp$0=2;

i=temp$0;

temp$1=2 * i;

temp$2=temp$1;

temp$3=temp$2 8;

j=temp$3;

多个操作被转换为三地址解析,通过temp分配值

让我们看一下Java的字节码行为:

0: iconst_2

1: istore_1

2: iconst_2

3: iload_1

4: imul

eft:0cm;">         5: iload_1


         6: iadd

         7: istore_2

 

在Java字节码中也是低级操作,但没有使用三地址方式,使用栈的方式来解决临时变量的问题。

Jimple是直接翻译的字节码的操作,并没有自己拆解复杂语句到低级操作

 

2.2.2 IR 的Shimple

Shimple 与Jimple的区别:SSA static single assignment form静态单赋值,可用于流敏感操作

将程式码转换为SSA形式,最简单的方法,就是将每个被赋值的变数,以一个新的变数来取代,而新的变数名称则为一个带着版号的旧变数

int i = i +100

 

i0 i0_0

i0_0=i0+100

 

 

2.3 Soot Stmt


 

Unit是Soot的单元, Stmt 继承Unit代表着执行的语句,Soot将执行指令分成多个类型

过程内控制流

IfStmt , GotoStmt , SwitchStmt

过程间的控制流:

InvokeStmt ,ReturnStmt,ReturnVoidStmt., ThrowStmt

监控语句:MonitorStmt

赋值语句:DefinitionStmt

其它类型:NopStmt, BreakponitStmt

已经不使用的语句RetStmt

 

 

2.4 Soot box


盒子(Boxes)

  一个盒子(Box)提供了一个间接访问soot (Unit,Value)的入口,类似于Java的一个引用,当Unit包含另一个Unit的时候,需要通过Box来访问,Soot 里提供了两种类型的Box, 一个是ValueBox一个是UnitBox

 

2.4.1 UnitBox

      

       一个UnixBox包含着一个Unit操作,一个Unit的操作会包含着多个UnitBox(有些类型的Unit会包含其他Unit的引用,那么这时候就需要包含Unixbox),比如说,GotoStmt 需要知道目标的Unit是什么,所以一个Unit会包含其它的UnitBox,通过 UnitBox获取下一个Unit

      

2.4.2 ValueBox

  与Unit类似,我们通常也需要指向Value的box。这被表示为ValueBox类。对于一个Unit,我们能够得到一系列的ValueBox ,包含了在Unit中使用的值以及定义的值, 一个Valuebox对应这一个Value,而一个value可以对应多个ValueBox
  比如上图的i0<0的表达式就是包含一个valuebox, conditionexprbox,里面包含着LtExpr的value,而LtExpr又包含这op1Box左边和op2Box右边两个ValueBox, op1Box的valuebox又包含着i0这个local的本地value, 以及op2Box的ValueBox又包含着0这个常量Value

 

Unit 包含着多个UnitBox, ValueBox, 而UnitBox,ValueBox又指向独立的Unit和Value, 这里看来Box 更象一个指针,指向Value和Unit

 

中间表达式的适配

Soot 对每个IR Jimple, Shimple等构建了每个语言自己的Unit,Stmt,ValueBox,Value,以便于各种不同的IR的分析

 

2.4.3 Value

Value数据,常见的比如local 变量名, constant 常量

一个ValueBox就包含着Value,在上面的例子里i1=0 等于是一个Stmt, i0是一个Valuebox,里面包含这i0这个local 的value


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐