第一部分:阅读了解
AnalysisScope要指定分析的应用程序和库代码。AnalysisSopeReader.makeJavaBinaryAnalysisScope(java.lang.String classPath,java.io.File exclusionsFile), classPath是分析的类路径,exclusionsFile为需要排除类层次结构的写入文件,也可以为null.AnalysisScopeReader.makeJavaBinaryAnalysisScope()http://wala.sourceforge.net/javadocs/trunk/com/ibm/wala/util/config/AnalysisScopeReader.html#makeJavaBinaryAnalysisScope(java.lang.String,%20java.io.File)
一个scope文件具有以下格式的行:
类加载器、语言、类型、位置
对于java而言,类加载器分为:Primodial、Extension和Application。据我理解,Primodial为标准库类加载器、Extension是第三方库类加载器,Application是所分析的项目本身的类加载器。
Application实体可以是class文件,包含class文件的二进制文件,jar包,或者源码文件源码文件夹
位置是给出的文件系统的适当位置。
以上是参考UserGuide:AnalysisScope - WalaWikihttp://wala.sourceforge.net/wiki/index.php/UserGuide:AnalysisScope
但是,自身对其理解较差。 目前认为,在makeJavaBinaryAnalysisScope时,所指定的第一classpath参数可以具体到一个class文件,或者jar包,或者源码。第二参数是需要在分析域中排除的文件。
第二部分:测试
1、传入jar包,测试结果可以运行。
package Teach;
import com.ibm.wala.classLoader.Language;
import com.ibm.wala.core.tests.callGraph.CallGraphTestUtil;
import com.ibm.wala.core.util.config.AnalysisScopeReader;
import com.ibm.wala.core.util.io.FileProvider;
import com.ibm.wala.ipa.callgraph.*;
import com.ibm.wala.ipa.callgraph.impl.Util;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.cha.ClassHierarchy;
import com.ibm.wala.ipa.cha.ClassHierarchyException;
import com.ibm.wala.ipa.cha.ClassHierarchyFactory;
import com.ibm.wala.util.MonitorUtil;
import java.io.IOException;
public class analysisclass {
public static void classanalysis() throws IOException, ClassHierarchyException, CallGraphBuilderCancelException {
AnalysisScope scope = AnalysisScopeReader.instance.makeJavaBinaryAnalysisScope("C:\\TestProject\\SimpleTest\\out\\artifacts\\SimpleTest_jar\\SimpleTest.jar", (new FileProvider()).getFile(CallGraphTestUtil.REGRESSION_EXCLUSIONS));
ClassHierarchy cha = ClassHierarchyFactory.make(scope);
String mainClass = "LMain";
Iterable<Entrypoint> entrypoints = Util.makeMainEntrypoints(cha, mainClass);
AnalysisOptions options = CallGraphTestUtil.makeAnalysisOptions(scope, entrypoints);
CallGraphBuilder<InstanceKey> builder = Util.makeVanillaZeroOneCFABuilder(Language.JAVA, options, new AnalysisCacheImpl(), cha);
CallGraph cg = builder.makeCallGraph(options, (MonitorUtil.IProgressMonitor)null);
System.out.println(cg);
}
public static void main(String[] args) throws IOException, ClassHierarchyException, CallGraphBuilderCancelException {
classanalysis();
}
}
2、传入class文件,测试结果:可行
具体到class文件
AnalysisScope scope = AnalysisScopeReader.instance.makeJavaBinaryAnalysisScope("C:\\TestProject\\SimpleTest\\target\\classes\\Main.class", (new FileProvider()).getFile(CallGraphTestUtil.REGRESSION_EXCLUSIONS));
具体到class文件所在文件夹
AnalysisScope scope = AnalysisScopeReader.instance.makeJavaBinaryAnalysisScope("C:\\TestProject\\SimpleTest\\target\\classes", (new FileProvider()).getFile(CallGraphTestUtil.REGRESSION_EXCLUSIONS));
3、传入源码java文件,测试结果:报错
AnalysisScope scope = AnalysisScopeReader.instance.makeJavaBinaryAnalysisScope("C:\\TestProject\\SimpleTest\\src\\main\\java\\Main.java", (new FileProvider()).getFile(CallGraphTestUtil.REGRESSION_EXCLUSIONS));
报错内容:Exception in thread "main" com.ibm.wala.util.debug.UnimplementedError: com.ibm.wala.shrike.shrikeCT.InvalidClassFileException: Class file invalid at 10: bad magic number: 1886741100
at com.ibm.wala.util.debug.Assertions.UNREACHABLE(Assertions.java:55)
at com.ibm.wala.core.util.config.AnalysisScopeReader.addClassPathToScope(AnalysisScopeReader.java:301)
at com.ibm.wala.core.util.config.AnalysisScopeReader.makeJavaBinaryAnalysisScope(AnalysisScopeReader.java:261)
at Teach.analysisclass.classanalysis(analysisclass.java:20)
at Teach.analysisclass.main(analysisclass.java:30)
将entrypoints更换依然报错,更换:
// Iterable<Entrypoint> entrypoints = Util.makeMainEntrypoints(cha, mainClass);
Iterable<Entrypoint> entrypoints = Util.makeMainEntrypoints(scope, cha);
第三部分:查看 exclusionsFile
CallGraphTestUtil.REGRESSION_EXCLUSIONS = "Java60RegressionExclusions.txt"
该部分可传入makeJavaBinaryAnalysisScope的第二个参数。显然这个文件可以自己指定。Java60RegressionExclusions.txt的位置在wala\lib的com.ibm.wala.core-1.5.8-SNAPSHOT.jar和com.ibm.wala.core-1.5.8-SNAPSHOT-sources.jar中,默认内容如下:
java\/awt\/.*
javax\/swing\/.*
sun\/awt\/.*
sun\/swing\/.*
com\/sun\/.*
sun\/.*
org\/netbeans\/.*
org\/openide\/.*
com\/ibm\/crypto\/.*
com\/ibm\/security\/.*
org\/apache\/xerces\/.*
dalvik\/.*
java\/io\/ObjectStreamClass*
apple\/.*
com\/apple\/.*
jdk\/.*
org\/omg\/.*
org\/w3c\/.*
第四部分:测试exclusionsFile
建立单独的文件,在原本Java60RegressionExclusions.txt增加一行Main.
AnalysisScope scope = AnalysisScopeReader.instance.makeJavaBinaryAnalysisScope("C:\\TestProject\\SimpleTest\\target\\classes", (new FileProvider()).getFile("C:\\wala\\src\\Teach\\exclusions.txt"));
此时报错,可能是因为排除了main就没有分析对象了,所以在包内增加了其他类help,并将help排除。
此时,在Java60RegressionExclusions.txt后增加一行:helpclass\/.help
发现在加入前调用图的输出有help类,加入后无help类,因此,可确定排除某些类的方式方法。