[Soot-list] Soot not finding class without a main for call graph
Eric Ortega
eortega at pjrcorp.com
Fri Feb 5 11:34:02 EST 2021
Hi Fogo,
Progress is good. Unfortunately, I’m not using soot for the same functionality that you are so I’m afraid you and I would be in the same boat there. Best of luck!
Regards,
Eric Ortega
From: Fogo Tunde-Onadele <oatundeo at ncsu.edu>
Date: Friday, February 5, 2021 at 5:47 AM
To: Eric Ortega <eortega at pjrcorp.com>
Cc: "soot-list at cs.mcgill.ca" <soot-list at cs.mcgill.ca>
Subject: Re: [Soot-list] Soot not finding class without a main for call graph
Hi Eric and all,
Thanks for the feedback. I got some success using a driver class although I encountered issues on the way. These issues stemmed from my improper use of java packages. This github issue<https://github.com/soot-oss/soot/issues/1346> was helpful as a reference (to ensure the package location was included in the classpath and the proper class naming was used).
I also found better progress using the basic way of setting the main class below, instead of using setApplicationClass and entrypoints in my prior excerpt (from the Soot Heros wiki<https://github.com/Sable/heros/wiki/Example%3A-Using-Heros-with-Soot>)
SootClass appclass = Scene.v().loadClassAndSupport(mainclass);
Scene.v().setMainClass(appclass);
Scene.v().loadNecessaryClasses();
1. However, I am now running into this error during the statement "solver.solve();" which I would appreciate help with:
[Thread-11] ERROR heros.solver.CountingThreadPoolExecutor - Worker thread execution failed: null java.lang.NullPointerException
2. The reason I want to use Heros is because it will be able to follow/filter the call path based on the inputs from the driver class (interprocedural control flow graph). I also wanted to clarify this because I can run without runtime errors with Soot and SPARK alone but it will give all the call edges it can find, rather than the path visited by the input.
3. Finally, I searched for examples that use Heros (since the wiki example does not include code to work with the IFDS solution) but did not have much luck. Any pointers to such examples will be much appreciated.
Thanks,
Fogo
On Tue, Feb 2, 2021 at 11:26 AM Eric Ortega <eortega at pjrcorp.com<mailto:eortega at pjrcorp.com>> wrote:
Hi Fogo,
Yes, I meant the rest of the classes in the .jar.
It sounds like Dr. Bodden was driving to a better point, in that there likely needs to be some sort of hook into the library. If you didn’t want to create a sample app with a driver, you might have success programmatically setting a method that you’re curious about as an entrypoint through the soot API. You can likely just use setEntryPoint() as you’ve already done. It takes a list anyway so just pick some other methods in your libraries and tack them onto your main.
Regards,
Eric Ortega
From: Fogo Tunde-Onadele <oatundeo at ncsu.edu<mailto:oatundeo at ncsu.edu>>
Date: Tuesday, February 2, 2021 at 5:15 AM
To: Eric Ortega <eortega at pjrcorp.com<mailto:eortega at pjrcorp.com>>
Cc: "soot-list at cs.mcgill.ca<mailto:soot-list at cs.mcgill.ca>" <soot-list at cs.mcgill.ca<mailto:soot-list at cs.mcgill.ca>>
Subject: Re: [Soot-list] Soot not finding class without a main for call graph
Hi Eric.
Thanks, you mean the rest of the classes contained in the jar? I also received a response from Dr. Bodden about having a driver class that instantiates my target class. I'll work on trying these out.
Thank you,
Fogo
On Mon, Feb 1, 2021 at 2:13 PM Eric Ortega <eortega at pjrcorp.com<mailto:eortega at pjrcorp.com>> wrote:
Hi Fogo,
You may want to try running through the rest of your classes and calling Scene.v().loadClass(…) for each one.
Regards,
Eric Ortega
From: Soot-list <soot-list-bounces at CS.McGill.CA<mailto:soot-list-bounces at CS.McGill.CA>> on behalf of Fogo Tunde-Onadele <oatundeo at ncsu.edu<mailto:oatundeo at ncsu.edu>>
Date: Monday, February 1, 2021 at 5:06 AM
To: "soot-list at cs.mcgill.ca<mailto:soot-list at cs.mcgill.ca>" <soot-list at cs.mcgill.ca<mailto:soot-list at cs.mcgill.ca>>
Subject: [Soot-list] Soot not finding class without a main for call graph
Good day,
I have been trying to get Soot working on analyzing the call graph of external libraries/apps. Specifically, I want to get the call graph of a class, ‘DefaultServlet’, within a Tomcat jar file, ‘catalina.jar’. First, I followed tutorials that analyze a simple class/file with a main method. However, the classes I want to analyze don’t typically have main methods. So I found and followed examples that utilize entrypoints but Soot is still unable to find the class. Please, I would appreciate some help. Here is the latest main piece of code I have tried.
```
public class IFDSDataFlowTransformer extends SceneTransformer {
static LinkedList<String> excludeList;
static String mainclass = "DefaultServlet";
static String mainmethod = "doGet"; // "doPut";
public static void main(String[] args) {
// Set Soot's internal classpath
String javapath = System.getProperty("java.class.path");
String jredir = System.getProperty("java.home")+"/lib/rt.jar";
String path = javapath+File.pathSeparator+jredir;
Options.v().set_soot_classpath(path);
// Enable whole-program mode
Options.v().set_whole_program(true);
Options.v().set_app(true);
// Call-graph options
Options.v().setPhaseOption("cg", "safe-newinstance:true");
Options.v().setPhaseOption("cg.cha","enabled:false");
// Enable SPARK call-graph construction
Options.v().setPhaseOption("cg.spark","enabled:true");
Options.v().setPhaseOption("cg.spark","verbose:true");
Options.v().setPhaseOption("cg.spark","on-fly-cg:true");
Options.v().set_allow_phantom_refs(true);
// Set the main class of the application to be analysed
Options.v().set_main_class(mainclass);
// Load the main class
SootClass c = Scene.v().loadClass(mainclass, SootClass.BODIES);
c.setApplicationClass();
// Load the "main" method of the main class and set it as a Soot entry point
// SootMethod entryPoint = c.getMethodByName("main");
SootMethod entryPoint = c.getMethodByName(mainmethod);
List<SootMethod> entryPoints = new ArrayList<SootMethod>();
entryPoints.add(entryPoint);
Scene.v().setEntryPoints(entryPoints);
PackManager.v().getPack("wjtp").add(new Transform("wjtp.herosifds", new IFDSDataFlowTransformer()));
// soot.Main.main();
//start working
PackManager.v().runPacks();
}
```
I am using Soot 3.3.1, Java 1.8 and I have exported my eclipse project in a zip below (project structure in photo). The files, IFDSDataFlowTransformer and TestSootCallGraph, start two separate trials.
Do I have to create a new class with a main that would start a request (e.g. http or curl request) to the Tomcat application? If so, that would require including more Tomcat jars/files in the project. However, I figured that Soot did not need specific inputs or all files in an application to statically analyze code.
Thank you,
Fogo
Error! Filename not specified.
--
Fogo Tunde-Onadele
PhD student
Computer Science
North Carolina State University
--
Fogo Tunde-Onadele
PhD student
Computer Science
North Carolina State University
--
Fogo Tunde-Onadele
PhD student
Computer Science
North Carolina State University
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.CS.McGill.CA/pipermail/soot-list/attachments/20210205/1336d5b9/attachment-0001.html>
More information about the Soot-list
mailing list