WALA使用笔记(4)- 分析域、makeJavaBinaryAnalysisScope使用

第一部分:阅读了解

AnalysisScope要指定分析的应用程序和库代码。AnalysisSopeReader.makeJavaBinaryAnalysisScope(java.lang.String classPath,java.io.File exclusionsFile), classPath是分析的类路径,exclusionsFile为需要排除类层次结构的写入文件,也可以为null.AnalysisScopeReader.makeJavaBinaryAnalysisScope()icon-default.png?t=M276http://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类,因此,可确定排除某些类的方式方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值