`
jamaica1982
  • 浏览: 30080 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Soot中的SmartLocalDefs代码浅析

阅读更多
今天读了读Soot中的SmartLocalDefs类,因为在其mailing list里面至少有2封邮件[1][2]推荐看看这个类,慕名而来 可惜的是,这个类相关的注释/文档太少,所以特此记录,以备后用。

首先这个类的成员包括5个域, 4个方法和1个内部类,下面就按次序简单描述一下各个部分。

一. 域
1)
private final Map<Cons, ArrayList<Unit>> answer;

answer用于存储该类所做分析的最终结果:将(cons Unit Local)映射到其所有可能的def所在的Units

2)
private final Map<Local, HashSet<Unit>> localToDefs;

localToDefs将每个Local映射到定义它的所有Units

3)
private final UnitGraph graph;

graph是分析过程中所用的流图

4)
private final LocalDefsAnalysis analysis;

analysis是内部类LocalDefsAnalysis的一个引用,稍后具体介绍LocalDefsAnalysis

5)
private final Map<Unit, HashSet> unitToMask;

unitToMask将Unit映射到在该Unit之后依然live的Locals

二. 方法
1)
public SmartLocalDefs(UnitGraph g, LiveLocals live)

类的构造函数,这个类的主要逻辑集中在该方法中(一大部分分析由内部类完成)。除了打印log之外,它干的活主要包括如下几个步骤:
  • 初始化graph, localToDefs,unitToMask
  • 将graph作为参数生成内部类LocalDefsAnalysis的一个实例。其实内部类在其构造函数被调用后,它已经默默的把主要的数据流分析都做完了
  • 对于每个Unit(记为u),首先找出它use的Locals,然后将每一个Local(记为v)能到达该Unit的defs取出,最后构建一个(cons u v)并将其连同对应的defs放入answer.


2)
private Local localDef(Unit u)

返回u当中定义的Local(即local变量)。注意,方法里一个隐含的assertion是一个Unit至多能定义一个Local。

3)
private HashSet<Unit> defsOf( Local l )

返回l所有可能的defs。这个方法直接将l作为key从localToDefs里面去找value了,如果找不到就先put一个空的HashSet,然后将其返回。所以该方法的返回值总是non-null。

4)
public List<Unit> getDefsOfAt(Local l, Unit s)

这个方法就是client使用SmartLocalDefs的主要途径,即提供一个Local和一个Unit,获取在这个Unit中所有l的defs。

三. 内部类
终于轮到苦工内部类LocalDefsAnalysis了。该类扩展了Soot框架提供的ForwardFlowAnalysis类,实现了一系列Soot进行数据流分析所需要的方法(关于这些方法的细节,可参考[3])。
这里就记录当前还没看太明白的问题:

protected void flowThrough(Object inValue, Object unit, Object outValue) {
  Unit u = (Unit) unit;
  HashSet in = (HashSet) inValue;
  HashSet<Unit> out = (HashSet<Unit>) outValue;
  out.clear();
  Set mask = unitToMask.get(u);
  Local l = localDef(u);
  HashSet<Unit> allDefUnits = null;
  
  if (l == null)
  {//add all units contained in mask
    for( Iterator inUIt = in.iterator(); inUIt.hasNext(); ) {
      final Unit inU = (Unit) inUIt.next();
        if( mask.contains(localDef(inU)) ){
	  out.add(inU);
	}
    }
  }else
  {//check unit whether contained in allDefUnits before add into out set.
    allDefUnits = defsOf(l);
				
    for( Iterator inUIt = in.iterator(); inUIt.hasNext(); ) {
      final Unit inU = (Unit) inUIt.next();
      if( mask.contains(localDef(inU)) )
      {//only add unit not contained in allDefUnits
	if ( allDefUnits.contains(inU)){
	  out.remove(inU);
	} else {
	  out.add(inU);
	}
       }
     }
   
     out.removeAll(allDefUnits);
     if(mask.contains(l)) out.add(u);
  }
}

1)为什么倒数第2行还要removeAll?
2)为什么最后1行在out.add(u)之前还要判断l是否在mask中?

其实还有一个大问题:这个SmartLocalDefs和SimpleLocalDefs有什么具体区别?
等回头有时间了,再仔细琢磨琢磨吧

[1] http://www.sable.mcgill.ca/pipermail/soot-list/2008-July/001872.html
[2] http://www.sable.mcgill.ca/pipermail/soot-list/2007-March/001084.html
[3] http://www.sable.mcgill.ca/soot/tutorial/analysis/index.html
分享到:
评论

相关推荐

    代码分析工具soot的使用文档

    Soot的优化功能能够在分析阶段生成Jimple码,对程序中的常量、无用循环或if条件语句进行优化,并在编译后删除冗余的变量和语句,从而优化目标代码。 Soot的总体框架包括输入文件的处理和输出文件的生成。它可以处理...

    Android代码-soot-infoflow-android

    在【压缩包子文件的文件名称列表】中,"soot-infoflow-android-master"表明这是一个包含了整个项目源代码的主分支。开发者可以在这个仓库中找到以下内容: 1. **源代码**:实现InfoFlow算法的Java类,以及与Android...

    soot相关jar包

    - Soot的命令行工具或者集成到构建工具(如Maven或Gradle)中,可以方便地对项目进行分析和优化。 - 通过编写脚本或集成到自己的工具链中,可以自定义分析和优化规则。 6. **Jimple IR**:Soot的主要工作在Jimple...

    soot 官方指导操作文档

    2. **语句**:Soot 支持对 Java 代码中的各种语句进行操作,包括但不限于赋值、条件判断、循环等。 #### 四、中间表示(IR) Soot 提供了多种中间表示形式来处理 Java 字节码,每种 IR 都有其特点和适用场景。 1. *...

    soot的一些例子

    4. **实践应用**:尝试修改示例代码,应用到自己的项目中,逐渐熟悉Soot的各种功能和用法。 总之,Soot是一个功能强大的工具,它的例子可以帮助我们深入理解程序分析和优化的基本概念,同时也为实际项目开发提供了...

    soot生成java程序的控制流图例子

    在Java编程中,理解控制流图可以帮助我们更好地理解代码的结构和行为,特别是在进行静态分析、优化或者调试时。Soot是一个强大的Java中间表示(Intermediate Representation, IR)框架,它提供了生成控制流图的能力...

    soot教程合集

    在“Soot教程合集”中,你将会找到关于如何安装Soot、配置环境、使用基本命令以及进行代码分析和优化的详细教程。这些教程通常以英文呈现,对于提升你的英语阅读能力和技术理解能力都是很好的锻炼。 总的来说,Soot...

    soot 详细教程

    在 **Soot** 和 Eclipse 中,属性(Attributes)是一种非常有用的概念,可以帮助开发者更好地理解代码结构。 - **属性管理**:使用属性来记录关于程序的元数据。 - **Eclipse 集成**:**Soot** 作为 Eclipse 插件,...

    程序分析工具soot的说明书

    Soot支持多种输入源,包括但不限于Java源代码、SML源代码、Scheme源代码、Eiffel源代码以及Java字节码文件。这些输入可以通过不同的工具(如javac、MLJ、KAWA、SmallEiffel等)转化为中间表示(IR),最终通过Soot...

    ANTLR和Soot的完整例子

    ANTLR和Soot是两个在编译器领域广泛应用的工具,它们在软件开发和语言处理中起着关键作用。本实验将结合ANTLR与Soot,帮助我们深入理解编译原理,特别是语法规则的定义、语法树的生成以及中间代码的产生。 ANTLR是...

    SOOT java插件

    2. **快捷访问**:在Eclipse的导航栏中,开发者可以直接启动SOOT的相关功能,进行代码分析和转换,提升了开发效率。 3. **可视化支持**:插件可能提供图形化的分析结果展示,帮助开发者直观理解代码优化前后的情况...

    soot生存手册(soot survivors guide)

    - Jimple:专为静态代码分析设计的三地址代码形式,是Soot中最常用的中间表示。 - Shimple:为Soot的Shim语言,是Jimple的一个扩展。 - Grimp:一种不直接从Java字节码生成的中间表示,它提供了某些抽象级别的...

    soot-2.3.0

    在实际应用中,Soot广泛用于学术研究、软件安全检测、性能优化以及动态代码修改等领域。例如,研究人员可以利用Soot探索新的编译优化技术,安全专家可以使用它来检测潜在的安全漏洞,而开发者则可以借助Soot提高应用...

    SootTest:使用Soot生成调用图和过程间控制流程图

    通过添加必要的类到场景中,Soot才能知道需要分析哪些代码。 4. **生成控制流图**: 使用`UnitGraph`类创建控制流图,表示单个方法的控制流。对于过程间控制流程图,Soot提供了`InterproceduralControlFlowGraph`类...

    soot的jar包

    soot配置jar包,用于java项目中调用soot相关的各种api。

    Soot - A Java optimization framework.zip

    5. 输出阶段:优化后的代码可以通过Soot再次转换回字节码,或者直接生成Java源代码,以便于进一步的编译和运行。 三、Soot的主要应用 1. 代码优化:开发者可以利用Soot的优化策略,针对特定的性能瓶颈进行代码优化...

    soot-android-static-analysis:使用Soot进行android应用静态分析

    检测应用中风险代码片段 检测应用可能存在的漏洞 Soot官方Wiki地址 代码结构 src\main\java\com\nii\soot\checker\UrlSootChecker.java 检测应用中存在的url地址 src\main\java\...

    soot相关jar包,Soot一个强大的Java优化框架

    Soot是一个强大的Java优化框架,主要用于静态分析和优化Java字节码。这个压缩包包含了使用Soot进行... - **静态分析**:Soot可以进行控制流分析、数据流分析,例如查找循环、检测死代码、分析类和方法调用关系等。

    soot-2.4.0.jar

    Since release 2.4.0, Soot is available as a single, runnable JAR file. You can just use java -jar soot-2.4.0.jar to run Soot.

Global site tag (gtag.js) - Google Analytics