[Soot-list] Basic usage of Paddle with Soot

115 views
Skip to first unread message

Ben Holland

unread,
Aug 13, 2015, 6:18:02 PM8/13/15
to soot...@cs.mcgill.ca
Hi,

I've been trying to run Paddle with Soot, but I'm having some issues.  I just want to get access to the PointsTo results and the callgraph.  My question is does Paddle actually work with Soot or is it out of synch with the current Soot?  It looks like work on Paddle more or less stopped in 2008.

I've read up on my literature for Soot and several of the Lhotak papers/thesis.  I've also read the Soot Survivors guide in it's entirety.  

I'm using the nightly build of Paddle from http://plg.uwaterloo.ca/~olhotak/build/, and I'm using the version of Soot available through the Eclipse update site at https://github.com/Sable/soot/wiki/Running-Soot-as-Eclipse-Plugin.

Running the following program gives me some errors.  Occasionally the error is different breaking on a Field instead of an array first.

java.lang.NoSuchMethodError: soot.Scene.getFieldNumberer()Lsoot/util/ArrayNumberer;
at soot.jimple.paddle.ArrayElement.<init>(ArrayElement.java:28)
at soot.PaddleSingletons.soot_jimple_paddle_ArrayElement(PaddleSingletons.java:33)
at soot.jimple.paddle.ArrayElement.v(ArrayElement.java:30)
at soot.jimple.paddle.NodeFactory.caseArgv(NodeFactory.java:127)
at soot.jimple.paddle.MethodNodeFactory.addMiscEdges(MethodNodeFactory.java:228)
at soot.jimple.paddle.TradMethodPAGBuilder.build(TradMethodPAGBuilder.java:63)
at soot.jimple.paddle.TradMethodPAGBuilder.update(TradMethodPAGBuilder.java:48)
at soot.jimple.paddle.DependencyManager.update(DependencyManager.java:76)
at soot.jimple.paddle.OFCGScene.solve(OFCGScene.java:168)
at soot.jimple.paddle.OFCGConfig.solve(OFCGConfig.java:35)
at soot.jimple.paddle.PaddleScene.solve(PaddleScene.java:1390)
at soot.jimple.paddle.PaddleTransformer.solve(PaddleTransformer.java:99)
at soot.jimple.paddle.PaddleTransformer.internalTransform(PaddleTransformer.java:46)
at soot.SceneTransformer.transform(SceneTransformer.java:39)
at soot.jimple.paddle.PaddleHook.internalTransform(PaddleHook.java:43)
at soot.SceneTransformer.transform(SceneTransformer.java:39)
at soot.Transform.apply(Transform.java:90)
at soot.RadioScenePack.internalApply(RadioScenePack.java:57)
at soot.jimple.toolkits.callgraph.CallGraphPack.internalApply(CallGraphPack.java:49)
at soot.Pack.apply(Pack.java:116)
at soot.PackManager.runWholeProgramPacks(PackManager.java:564)
at soot.PackManager.runPacksNormally(PackManager.java:457)
at soot.PackManager.runPacks(PackManager.java:392)
at soot.Main.run(Main.java:271)
at soot.Main.main(Main.java:147)
at PaddleTest.main(PaddleTest.java:43)

public class PaddleTest {

public final static String projectDir = "<my workspace path>/TestProject/bin";
public static void main(String[] args) {
// reset soot
Scene.v().releaseActiveHierarchy();
Scene.v().releaseCallGraph();
Scene.v().releaseFastHierarchy();
Scene.v().releasePointsToAnalysis();
Scene.v().releaseReachableMethods();
Scene.v().releaseSideEffectAnalysis();
G.reset();

// setup soot args
List<String> sootArgs = new LinkedList<String>();
// analyze entire directory
sootArgs.add("-process-dir"); 
sootArgs.add(projectDir);
sootArgs.add("-w"); // enable whole program mode

// setup spark options
sootArgs.add("-p");
sootArgs.add("cg.paddle");
sootArgs.add("enabled:true,verbose:true");
// run soot
try {
String[] argsArray = sootArgs.toArray(new String[0]);
soot.Main.main(argsArray);
// iterate over call graph results
CallGraph callGraph = Scene.v().getCallGraph();
System.out.println("Number of edges in callgraph: " + callGraph.size());
// PointsToAnalysis p = Scene.v().getPointsToAnalysis();
} catch (Throwable t){
System.out.println("Soot class path " + Scene.v().getSootClassPath());
t.printStackTrace();
}
}
}

The Soot Survivors Guide shows a slightly example, but I have had difficulty setting the classpath and standard soot options using that method.  Do you have a simple example of running Paddle somewhere you could share?

PaddleTransformer pt = new PaddleTransformer();
PaddleOptions paddle_opt = new PaddleOptions(myPaddleOptions);
pt.setup(paddle_opt);
pt.solve(paddle_opt);
soot.jimple.paddle.Results.v().makeStandardSootResults();

~Ben

Steven Arzt

unread,
Aug 14, 2015, 3:31:13 AM8/14/15
to Ben Holland, soot...@cs.mcgill.ca

Hi Ben,

 

You are using a fairly outdated version of Soot. The plugin is not really regularly updated with the current version of Soot. Thus, if you are just interested in obtaining Soot, I would either take the source code from Github and compile it or take our nightly builds: https://ssebuild.cased.de/nightly/soot/lib/soot-trunk.jar. This build should directly include Paddle and should at least not throw any funny errors due to mismatching method signatures.

 

Best regards,

  Steven

 

 

M.Sc. M.Sc. Steven Arzt

Secure Software Engineering Group (SSE)

European Center for Security and Privacy by Design (EC SPRIDE)

Rheinstraße 75

D-64293 Darmstadt

Phone: +49 61 51 869-336

Fax: +49 61 51 16-72118

eMail: steve...@ec-spride.de

Web: http://sse.ec-spride.de

Denis Bogdanas

unread,
Mar 21, 2016, 9:57:52 PM3/21/16
to soot, soot...@cs.mcgill.ca, Steve...@cased.de
Hi,
I tried to run paddle example from soot survivor's guide. Paddle definitely seems out of sync with soot.

After properly setting up everything, I get the error:

Exception in thread "main" java.lang.NoClassDefFoundError: soot/util/Heap$Keys
    at soot.jimple.paddle.OFCGScene.<init>(OFCGScene.java:88)
    at soot.jimple.paddle.OFCGConfig.setup(OFCGConfig.java:29)
    at soot.jimple.paddle.PaddleScene.setup(PaddleScene.java:1321)
    at soot.jimple.paddle.PaddleTransformer.setup(PaddleTransformer.java:84)
    at dk.brics.paddle.PointsToAnalysis.setPaddlePointsToAnalysis(PointsToAnalysis.java:120)
    at dk.brics.paddle.PointsToAnalysis.main(PointsToAnalysis.java:44)

There's no such class "soot.util.Heap" in the latest soot codebase.

By the way, soot-trunk.jar doesn't include paddle distribution.
Reply all
Reply to author
Forward
0 new messages