Soot经常用于对代码或者 日志的静态分析或动态分析。它是一款用于分析和优化Java 程序的软件工程工具。它可以提供Call Graph,程序内的数据分析。为了进行程序内的数据分析,它在一个叫做UnitGraph的控制流图上进行操作。
摘要
这篇文章描述了soot工具的特点,总结了它的发展过程,讨论了对程序分析框架有用的功能。
1. Introduction
soot工具是从2000年发布的,可以用来建立对java代码的静态分析工具,已经被广泛应用于各种程序转换工具、指针分析、并发程序分析、符号执行以及静态和动态混合分析方法中的静态分析部分。
从本质上讲,soot就是一个编译器,它能把JVM字节码或者java源代码转化为java字节码。下图描述了soot的工作流程。研究人员可以通过分析或者转换soot的中间表示来扩展soot。
soot主要包含以下特征:
- 可以生成java字节码的简化三地址中间表示;
- 具有大量的指针分析(指针分析关注的是一个变量可以指向哪些对象)和函数调用图生成算法;
- 能够生成可执行的java字节码。
2. SOOT FEATURES
这部分讨论了soot框架的特征,以及关于soot输出分析和转化结果的一些规定,并且提到了关于这些特征的应用。
A. Intraprocedural Features
Soot的基本中间表示形式是Jimple,是一种(typed,简化的?被修改的?有类型的?)三地址编码。直接分析Java字节码具有很大的难度(虽然可以为Java字节码建立控制流图,但是它隐式的堆栈结构掩盖了数据的流动),因此研究人员创建了Jimple。例如,给定一个字节码指令s,我们很难确定是先前的哪个s’生成了s的基于堆栈的输入。而Jimple将数据存储在已命名的本地变量中,而不是在隐式的堆栈中,这使得本地数据流更加明显。在Jimple中,本地变量将根据“定义-使用链”来划分。
Soot还包含其他的中间表示形式,例如Shimple(一种基于SSA的Jimple),Baf和Grimple(用来输出字节码),Dava(一种基于ast的中间表示,通过反编译Jimple指令得到)。
许多soot的使用者希望将他们的分析结果和java源代码对应起来,而soot可以很方便地提取类和方法的名字,因为java字节码包含了类和方法结构的源代码