Soot -- 关于语句图(UnitGraph)的说明

来源:互联网 发布:2017网络歌曲排行榜 编辑:程序博客网 时间:2024/06/14 00:06
BriefUnitGraph

生成UnitGraph

这里说明一下 UnitGraph 设计的巧妙之处

  • 正确区分职责】【区分管理者与员工】【区分各自应该拥有的数据
  • 数据的关系 与数据的内容分离(new
  • 如下:
  • UnitGraph好的地方就在于,将关系进行了保存。【弄清了自己的职责】(所以我操作元素之间的关系(增加,删除)的时候,本质上操作的是UnitGraph中存储的数据
  • 但是不会对Body中的内容,Unit中的内容造成影响
  • 造成的影响:而我进行删除操作的时候又不会影响原来基本成员对象中的内容。

代码中有说明:

private static void testCFG2(SootMethod method) {// 1.获得方法体。Body b = method.retrieveActiveBody();System.out.println(b.toString());//2.将方法体中的语句组织成图的形式。(一个方法中更像是一棵树)【语句之间的逻辑关系建立】UnitGraph g = new BriefUnitGraph(b);Iterator<Unit> it = g.iterator();//3.结点的一些说明。/** * (1)结点并不清楚自己的逻辑位置,前后关系不是很清楚的。 * (2)UnitGraph更清楚各个结点的位置,以及相互之间的逻辑关系。(管理者) * (3)正确区分: Unit 以及 UnitGraph各自的职责。 */while (it.hasNext()) {Unit tmpUnit = it.next();if (tmpUnit.branches()) {System.out.println("the branch is :" + tmpUnit.toString());List<Unit> us = g.getSuccsOf(tmpUnit);  //分支情况下,一个Unit是有多个后继节点的。Iterator<Unit> i = us.iterator();while (i.hasNext()) {System.out.println("the secc is : " + i.next());}}}}

soot中不同类型UnitGraph介绍

soot中UnitGraph是一个抽象程度较高的语句图。

继承UnitGraph的有4种:

  • BriefUnitGraph
  • EnhancedUnitGraph
  • ExceptionalUnitGraph
  • TrapUnitGraph

下面给出一个UnitGraph的示例,然后查看不同的UnitGraph的特征。

待建立UnitGraph的代码

public class ExceptionTest {public static void main(String[] args) {}public static void C(int data){try {if (data > 0 ){System.out.println("right?");}else{throw new Exception();}}catch(Exception e){if(data == 1){System.out.println("data = 1,in the exception!!");}else{System.out.println("data != 1,in the exception!!");}}}}

对应的BriefUnitGraph

  • 正常,异常分离】可以看出BriefUnitGraph将正常的流程,与异常的处理流程进行了分离。(不相交,在最后才进行汇聚)



对应的ExceptionalUnitGraph

  • 融合】将正常流程与异常流程进行了融合,而不再是分离的。
  • 什么时候跳转到异常?】正常的语句若是需要跳转到异常流程中,那么就需要在try包围之中。(所以可以看到很多语句会有跳转到异常流程中 e ;= @caughtexception



对应的TrapUnitGraph

  • 相对于ExceptionalUnitGraph】一些很普通的语句也会跳转到异常流程中。(比如nop,goto[?=nop])---->认为try 中包含的所有的语句都有可能触发异常




0 0
原创粉丝点击