今天读了读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的优化功能能够在分析阶段生成Jimple码,对程序中的常量、无用循环或if条件语句进行优化,并在编译后删除冗余的变量和语句,从而优化目标代码。 Soot的总体框架包括输入文件的处理和输出文件的生成。它可以处理...
在【压缩包子文件的文件名称列表】中,"soot-infoflow-android-master"表明这是一个包含了整个项目源代码的主分支。开发者可以在这个仓库中找到以下内容: 1. **源代码**:实现InfoFlow算法的Java类,以及与Android...
- Soot的命令行工具或者集成到构建工具(如Maven或Gradle)中,可以方便地对项目进行分析和优化。 - 通过编写脚本或集成到自己的工具链中,可以自定义分析和优化规则。 6. **Jimple IR**:Soot的主要工作在Jimple...
2. **语句**:Soot 支持对 Java 代码中的各种语句进行操作,包括但不限于赋值、条件判断、循环等。 #### 四、中间表示(IR) Soot 提供了多种中间表示形式来处理 Java 字节码,每种 IR 都有其特点和适用场景。 1. *...
4. **实践应用**:尝试修改示例代码,应用到自己的项目中,逐渐熟悉Soot的各种功能和用法。 总之,Soot是一个功能强大的工具,它的例子可以帮助我们深入理解程序分析和优化的基本概念,同时也为实际项目开发提供了...
在Java编程中,理解控制流图可以帮助我们更好地理解代码的结构和行为,特别是在进行静态分析、优化或者调试时。Soot是一个强大的Java中间表示(Intermediate Representation, IR)框架,它提供了生成控制流图的能力...
在“Soot教程合集”中,你将会找到关于如何安装Soot、配置环境、使用基本命令以及进行代码分析和优化的详细教程。这些教程通常以英文呈现,对于提升你的英语阅读能力和技术理解能力都是很好的锻炼。 总的来说,Soot...
在 **Soot** 和 Eclipse 中,属性(Attributes)是一种非常有用的概念,可以帮助开发者更好地理解代码结构。 - **属性管理**:使用属性来记录关于程序的元数据。 - **Eclipse 集成**:**Soot** 作为 Eclipse 插件,...
Soot支持多种输入源,包括但不限于Java源代码、SML源代码、Scheme源代码、Eiffel源代码以及Java字节码文件。这些输入可以通过不同的工具(如javac、MLJ、KAWA、SmallEiffel等)转化为中间表示(IR),最终通过Soot...
ANTLR和Soot是两个在编译器领域广泛应用的工具,它们在软件开发和语言处理中起着关键作用。本实验将结合ANTLR与Soot,帮助我们深入理解编译原理,特别是语法规则的定义、语法树的生成以及中间代码的产生。 ANTLR是...
2. **快捷访问**:在Eclipse的导航栏中,开发者可以直接启动SOOT的相关功能,进行代码分析和转换,提升了开发效率。 3. **可视化支持**:插件可能提供图形化的分析结果展示,帮助开发者直观理解代码优化前后的情况...
- Jimple:专为静态代码分析设计的三地址代码形式,是Soot中最常用的中间表示。 - Shimple:为Soot的Shim语言,是Jimple的一个扩展。 - Grimp:一种不直接从Java字节码生成的中间表示,它提供了某些抽象级别的...
在实际应用中,Soot广泛用于学术研究、软件安全检测、性能优化以及动态代码修改等领域。例如,研究人员可以利用Soot探索新的编译优化技术,安全专家可以使用它来检测潜在的安全漏洞,而开发者则可以借助Soot提高应用...
通过添加必要的类到场景中,Soot才能知道需要分析哪些代码。 4. **生成控制流图**: 使用`UnitGraph`类创建控制流图,表示单个方法的控制流。对于过程间控制流程图,Soot提供了`InterproceduralControlFlowGraph`类...
soot配置jar包,用于java项目中调用soot相关的各种api。
5. 输出阶段:优化后的代码可以通过Soot再次转换回字节码,或者直接生成Java源代码,以便于进一步的编译和运行。 三、Soot的主要应用 1. 代码优化:开发者可以利用Soot的优化策略,针对特定的性能瓶颈进行代码优化...
检测应用中风险代码片段 检测应用可能存在的漏洞 Soot官方Wiki地址 代码结构 src\main\java\com\nii\soot\checker\UrlSootChecker.java 检测应用中存在的url地址 src\main\java\...
Soot是一个强大的Java优化框架,主要用于静态分析和优化Java字节码。这个压缩包包含了使用Soot进行... - **静态分析**:Soot可以进行控制流分析、数据流分析,例如查找循环、检测死代码、分析类和方法调用关系等。
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.