WALA是IBM公司于2006年开源,目前可以从github上获取源码,编译,使用,但是在国内,编译WALA可能会被qiang,所以,直接使用maven仓库中已经编译好的WALA二进制包是最为方便的。
WALA核心功能:
- Java的系统类型和类的层次结构分析
- 源语言框架支持java和javascript
- 过程间数据流分析(RHS的求解器)
- 基于上下文敏感的切片
- 指针分析与调用图构造
- 基于SSA的寄存器转换语言IR
- 迭代数据流的总体框架
- 通用分析实用程序和数据结构
- 一个字节码库(Shrike)和一个java动态负荷时间仪表库(DILA)
本文使用maven中的二进制包,利用WALA做最简单的类分析。
首先从maven库中下载二进制包,链接如下:
http://mvnrepository.com/artifact/com.ibm.wala
然后非常重要的一点就是要将core.jar中的java路径,不修改的话可能会导致错误。使用winrar软件打开core.jar文件
将log_sample.properties和wala_sample.properties两个文件修改如图中所示的名字,并保存,然后打开wala.properties,
将java_runtime_dir设置为PC当前的java路径 ,比如:java_runtime_dir= C:/Program Files/Java/jre1.8.0_144/lib
然后保存到jar包中即可。
然后将jar包导入到eclipse中,
导入好的包如下图所示
这里建议下载1.4.3版本(eclipse中新建工程等省略)
这一步也十分重要
将上图中的Java60RegressionExclusions.txt、primordial.jar、primordial.txt三个文件从源码(自行从github上下载即可)中找到,并且复制粘贴到eclipse工程中即可,不导入也会产生错误。
接下来,就可以使用WALA进行简单的类分析。
public static void main(String args[]) throws IOException, ClassHierarchyException, IllegalArgumentException, InvalidClassFileException, CancelException {
// 获得一个文件
File exFile=new FileProvider().getFile("Java60RegressionExclusions.txt");
// 将分析域存到文件中
AnalysisScope scope = AnalysisScopeReader.makeJavaBinaryAnalysisScope("zookeeper-3.3.6.jar", exFile);
// 构建ClassHierarchy,相当与类的一个层级结构
ClassHierarchy cha = ClassHierarchyFactory.make(scope);
// 循环遍历每一个类
for(IClass klass : cha) {
// 打印类名
System.out.println(klass.getName().toString());
// 判断当前类是否在zookeeper中
if(scope.isApplicationLoader(klass.getClassLoader())) {
// 对在zookeeper中的类的每个函数遍历,并打印函数名
for (IMethod m : klass.getAllMethods()) {
System.out.println(m.getName().toString());
}
}
}
}
以上代码是一个最简单的类名打印和函数名打印的功能。
WALA首页:http://wala.sourceforge.net/wiki/index.php/Main_Page
本次就先简单的介绍如何使用WALA进行最简单的类名和函数名分析,下一篇将介绍如何构建调用图和系统依赖图。