gpt4 book ai didi

java - 如何使用 soot 分析 .class 文件?

转载 作者:行者123 更新时间:2023-12-01 16:28:44 25 4
gpt4 key购买 nike

我正在尝试使用 soot 为 Spotbugs-4.0.2 构建一个调用图(CG)。代码如下所示。

public static void main(String[] args) {

String analyzed_classes_dir = "C:\\Users\\lyu\\lll\\src\\test\\java\\com\\demo\\dir3\\spotbugs"; //contains all structured class files
String mainclass = "edu.umd.cs.findbugs.LaunchAppropriateUI";

//set classpath
String javapath = System.getProperty("java.class.path");
String jredir = System.getProperty("java.home") + "\\lib\\rt.jar";
String libs = "C:\\Users\\liuyu\\lll\\src\\test\\java\\com\\demo\\libs\\spotbugs-4.0.2\\";
String path = javapath + File.pathSeparator + jredir + File.pathSeparator + libs;

Scene.v().setSootClassPath(path);

//add an intra-procedural analysis phase to Soot
TestCallGraphSootJar_3 analysis = new TestCallGraphSootJar_3();
PackManager.v().getPack("wjtp").add(new Transform("wjtp.TestSootCallGraph", analysis));

excludeJDKLibrary();

Options.v().set_process_dir(Arrays.asList(analyzed_classes_dir));
Options.v().set_whole_program(true);
Options.v().set_no_bodies_for_excluded(true);
Options.v().set_allow_phantom_refs(true);

Scene.v().loadNecessaryClasses();
SootClass appclass = Scene.v().getSootClass(mainclass);
Scene.v().setMainClass(appclass); // exception here.

enableSparkCallGraph();

PackManager.v().runPacks();
}

然后是异常:

Exception in thread "main" java.lang.RuntimeException: Main-class has no main method!
at soot.Scene.setMainClass(Scene.java:187)
at com.ouc.TestCallGraphSootJar_3.main(TestCallGraphSootJar_3.java:65)

语句“Scene.v().setMainClass(appclass);”抛出上述异常。我调试了一下,发现appclass中的methodlst为null。而appclass是幻影。如图所示。 fig. the debug information of appclass

指定路径中确实存在mainclass,并且它确实包含main方法。

我已在 GitHub ( https://github.com/Sable/soot/issues/1346#issuecomment-627551137 ) 中提交了一个问题,但没有解决。还有options manual也没有帮助解决这个问题。

顺便问一下,我可以只分析给定类中的调用关系吗?比如我只想获取C1类内部的调用信息。

Class C1{
main(){
m1(parm);
}

m1(args){
m2(xxx);
}

m2(args){
m3(xxx);
}

m3(args){
...
}
}

那么我只想获取follow调用关系:

main——>m1()——>m2()——m3()

如果main或m1或m2或m3调用另一个类C2中的方法,我将忽略它,只关注C1中的方法。

最佳答案

我是提问者,我已经解决了。如果您对这个问题感兴趣,可以阅读本期post .

关于java - 如何使用 soot 分析 .class 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62094822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com