Open pikuit opened 4 years ago
Okay, the error is telling us that soot did not find the rt.jar
.
In your command line options can you please omit the cmd-parameter cp
and just use the cmd-paramter -process-dir
.
Given your command line, soot uses the classpath -cp lib\soot-4.2.1-jar-with-dependencies.jar;.
and tries to find rt.jar
in these directories. Obviously, soot is unable to locate the rt.jar
, and thus fails to load basic classes, e.g., String, Object
, etc.
Remediated the soot classpath runtime exception by setting the below options to execute the soot and run callgraph.
Options.v().set_verbose(false); Options.v().set_keep_line_number(true); Options.v().set_src_prec(Options.src_prec_class); //Options.v().set_soot_classpath(classpath); Options.v().set_prepend_classpath(true); Options.v().set_soot_classpath(classpath);
But facing issue with callgraph as Soot is unable to run with main method in spring mvc code . kindly assist how to do a callgraph in spring-mvc
Super, that the RuntimeException is fixed! Can you give more details concerning the issue? Does not soot find the main method?
Created a sample Spring mvc HelloController below class with added provided jars: spring-web-3.2.18.RELEASE.jar, org.springframework.web-3.2.2.RELEASE.jar, org.springframework.web.servlet-3.2.2.RELEASE.jar, org.springframework.expression-3.2.1.RELEASE.jar, org.springframework.core-3.2.2.RELEASE.jar, org.springframework.context-3.2.2.RELEASE.jar, org.springframework.beans-3.2.2.RELEASE.jar, org.springframework.asm-3.1.4.RELEASE.jar, commons-logging-1.2.jar
HelloController.java
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.ui.ModelMap;
@Controller @RequestMapping("/hello") public class HelloController { @RequestMapping(method = RequestMethod.GET) public String printHello(ModelMap model) { model.addAttribute("message", "Hello Spring MVC Framework!"); return "hello"; } }
Options.v().set_verbose(false);
Options.v().set_keep_line_number(true);
Options.v().set_src_prec(Options.src_prec_class);
//Options.v().set_soot_classpath(classpath);
Options.v().set_prepend_classpath(true);
Options.v().set_soot_classpath(
String path=<libary path>;
File folder = new File(path);
File[] files = folder.listFiles();
List<String> flpath = new ArrayList<String>();
for(File fl:files) {
flpath.add(fl.toString());
}
Options.v().set_process_dir(flpath);
Options.v().set_allow_phantom_refs(true);
PhaseOptions.v().setPhaseOption("bb", "off");
PhaseOptions.v().setPhaseOption("tag.ln", "on");
PhaseOptions.v().setPhaseOption("jj.a", "on");
PhaseOptions.v().setPhaseOption("jj.ule", "on");
Options.v().set_whole_program(true);
List<String> argsList = new ArrayList<String>(Arrays.asList(args));
argsList.addAll(Arrays.asList(new String[]{
"-w",
// "-main-class"
}));
Map<String , String> fileMAp = new HashMap<String , String>();
fileMAp.put("test.HelloController","printHello");
SootClass a = Scene.v().loadClassAndSupport("test.UserMain");
Scene.v().setMainClass(a);
Exception:
Soot started on Sat Aug 22 21:28:17 IST 2020
java.lang.RuntimeException: Failed to convert <org.springframework.asm.commons.AnalyzerAdapter: void visitFrame(int,int,java.lang.Object[],int,java.lang.Object[])>
at soot.asm.AsmMethodSource.getBody(AsmMethodSource.java:2163)
at soot.SootMethod.retrieveActiveBody(SootMethod.java:402)
at soot.jimple.toolkits.annotation.LineNumberAdder.internalTransform(LineNumberAdder.java:64)
at soot.PackManager.runPacksNormally(PackManager.java:491)
at soot.PackManager.runPacks(PackManager.java:419)
at soot.Main.run(Main.java:269)
at soot.Main.main(Main.java:141)
at MySootTest.main(MySootTest.java:139)
Caused by: java.lang.RuntimeException: Trying to create virtual invoke expression for interface type (org.springframework.asm.MethodVisitor in file uknown). Use JInterfaceInvokeExpr instead!
at soot.jimple.internal.JVirtualInvokeExpr.
Callgraph is not working and soot is throwing above exception
Any update on how to achieve callgraph on spring-mvc application
@pikuit In the options you set to resolve the runtime exception, what did you set as classpath?
Steps to reproduce: 1.) ..Run the below code with jdk 8 in eclipse 2019-12 with soot-4.2.1-jar-with-dependencies.jar
Files used to reproduce: import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Map;
import soot.MethodOrMethodContext; import soot.PackManager; import soot.Scene; import soot.SceneTransformer; import soot.SootClass; import soot.SootMethod; import soot.Transform; import soot.jimple.toolkits.callgraph.CHATransformer; import soot.jimple.toolkits.callgraph.CallGraph; import soot.jimple.toolkits.callgraph.Targets; public class MySootTest {
}
Soot version:
Command line:
Max Memory:
Stack trace: