【Soot学习日志 原创】

Soot学习日志

前言

Soot 是一个用于分析和优化 Java 字节码的开源框架。它提供了强大的工具和库,用于在 Java 程序的编译过程中进行静态分析、优化和转换。这些对java字节码分析、优化、转换的工作被归入到了各个Pack(包)中,具体的处理则是由Pack中的一组Phase(阶段)来完成。例如我们可以把将Java字节码转换为Jimple的工作归入到A Pack这个包中,在转换的过程中涉及到许多阶段,要先把字节码里的类、方法、变量解析出来,然后再对无效赋值、未使用到的变量等操作进行优化,我们就可以把这两个阶段分别定义为 P1、P2。于是在字节码转Jimple的时候,A Pack就会被调用,其中P1、P2也就会被A Pack调用,以完成转换工作。
在这里插入图片描述

Pack-jj

官方对于soot中的每一个pack以及pack中的phase都有较为清晰的描述。来让我们看一下官方对于jj Pack的描述,jj Pack(包)主要是负责将类中的方法体转换为jimple。
在这里插入图片描述

Phase-jj.ls

jj.ls Phase是jj Pack(包)中的一个阶段,该阶段主要负责优化方法体中的局部变量的DU-UD webs(变量定义-使用关系),将每一个相连的 web都与单个独立的局部变量关联。
在这里插入图片描述

看到这里可能大家会觉得有点迷惑,什么是DU-UD webs?什么又是相连的web?能不能讲人话,别急,请听我细细道来。
DU-UD webs(变量定义-使用关系)是一种数据结构,描述了变量的定义与变量的使用的关系。下图就展示了代码中局部变量x的DU-UD webs
在这里插入图片描述
在这里插入图片描述

但未经优化的DU-UD webs实际上是会造成一些含糊不清的映射关系的,例如下图代码所形成的DU-UD webs,当我们想要通过x被使用的第10行foo(x,y)在DU-UD webs中寻找变量x的定义的时候,就会找到两个截然不同的定义,此时谁也分辨不了10行的foo(x,y)对应的x的定义是哪一个?
在这里插入图片描述
在这里插入图片描述
造成这样的原因就算因为一个变量的使用关联到了多个定义上,因此我们需要对DU-UD webs进行优化。我们可以将x=e2中的x看作一个新的局部变量x2,此时对于变量x的DU-UD webs就变为了下图所示的样子,当我们再要去寻找x被使用的第10行的代码对应的定义的时候,就是通过foo(x2,y)去寻找了,并且找到的定义是唯一的。
在这里插入图片描述

Phase-jj.ls便是代替我们完成了上面的优化工作,在JimpleBodyPack中我们打上一个断点,让程序停留在执行Phase-jj.ls之前,这时候来看看jimple长什么样
在这里插入图片描述
在这里插入图片描述
此时我们从jimple上得到的关于局部变量x的DU-UD webs是未优化的,就会出现映射关系模糊的问题,再让我们的程序继续往下执行jj.ls,执行完成后就得到了针对DU-UD优化后的jimple,最后从中获取到的关于局部变量x的DU-UD webs也就不会出现映射关系模糊的问题了
在这里插入图片描述
未完待续…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值