如何使用烟灰分析 .class 文件?
How to analyze .class files using soot?
我正在尝试使用 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) but didn't solve it. And the options manual 也没有帮助解决这个问题。
顺便说一句,我可以只分析给定 class 中的调用关系吗?比如我只想获取classC1.
里面的调用信息
Class C1{
main(){
m1(parm);
}
m1(args){
m2(xxx);
}
m2(args){
m3(xxx);
}
m3(args){
...
}
}
那我只想获取follow call关系:
main——>m1()——>m2()——m3()
如果main或m1或m2或m3调用另一个class C2中的方法,我将忽略它,只关注C1中的方法。
我是提问者,我已经解决了。如果你对这个问题感兴趣,可以在本期阅读post.
我正在尝试使用 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) but didn't solve it. And the options manual 也没有帮助解决这个问题。
顺便说一句,我可以只分析给定 class 中的调用关系吗?比如我只想获取classC1.
里面的调用信息Class C1{
main(){
m1(parm);
}
m1(args){
m2(xxx);
}
m2(args){
m3(xxx);
}
m3(args){
...
}
}
那我只想获取follow call关系:
main——>m1()——>m2()——m3()
如果main或m1或m2或m3调用另一个class C2中的方法,我将忽略它,只关注C1中的方法。
我是提问者,我已经解决了。如果你对这个问题感兴趣,可以在本期阅读post.