<div dir="ltr">Hi,<div><br></div><div>I&#39;ve been trying to run Paddle with Soot, but I&#39;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.</div><div><br></div><div>I&#39;ve read up on my literature for Soot and several of the Lhotak papers/thesis.  I&#39;ve also read the Soot Survivors guide in it&#39;s entirety.  </div><div><br></div><div>I&#39;m using the nightly build of Paddle from <a href="http://plg.uwaterloo.ca/~olhotak/build/">http://plg.uwaterloo.ca/~olhotak/build/</a>, and I&#39;m using the version of Soot available through the Eclipse update site at <a href="https://github.com/Sable/soot/wiki/Running-Soot-as-Eclipse-Plugin">https://github.com/Sable/soot/wiki/Running-Soot-as-Eclipse-Plugin</a>.</div><div><br></div><div>Running the following program gives me some errors.  Occasionally the error is different breaking on a Field instead of an array first.</div><div><br></div><div><div>java.lang.NoSuchMethodError: soot.Scene.getFieldNumberer()Lsoot/util/ArrayNumberer;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.jimple.paddle.ArrayElement.&lt;init&gt;(ArrayElement.java:28)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.PaddleSingletons.soot_jimple_paddle_ArrayElement(PaddleSingletons.java:33)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.jimple.paddle.ArrayElement.v(ArrayElement.java:30)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.jimple.paddle.NodeFactory.caseArgv(NodeFactory.java:127)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.jimple.paddle.MethodNodeFactory.addMiscEdges(MethodNodeFactory.java:228)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.jimple.paddle.TradMethodPAGBuilder.build(TradMethodPAGBuilder.java:63)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.jimple.paddle.TradMethodPAGBuilder.update(TradMethodPAGBuilder.java:48)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.jimple.paddle.DependencyManager.update(DependencyManager.java:76)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.jimple.paddle.OFCGScene.solve(OFCGScene.java:168)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.jimple.paddle.OFCGConfig.solve(OFCGConfig.java:35)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.jimple.paddle.PaddleScene.solve(PaddleScene.java:1390)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.jimple.paddle.PaddleTransformer.solve(PaddleTransformer.java:99)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.jimple.paddle.PaddleTransformer.internalTransform(PaddleTransformer.java:46)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.SceneTransformer.transform(SceneTransformer.java:39)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.jimple.paddle.PaddleHook.internalTransform(PaddleHook.java:43)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.SceneTransformer.transform(SceneTransformer.java:39)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.Transform.apply(Transform.java:90)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.RadioScenePack.internalApply(RadioScenePack.java:57)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.jimple.toolkits.callgraph.CallGraphPack.internalApply(CallGraphPack.java:49)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.Pack.apply(Pack.java:116)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.PackManager.runWholeProgramPacks(PackManager.java:564)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.PackManager.runPacksNormally(PackManager.java:457)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.PackManager.runPacks(PackManager.java:392)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.Main.run(Main.java:271)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at soot.Main.main(Main.java:147)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>at PaddleTest.main(PaddleTest.java:43)</div></div><div><br></div><div><div>public class PaddleTest {</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>public final static String projectDir = &quot;&lt;my workspace path&gt;/TestProject/bin&quot;;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>public static void main(String[] args) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>// reset soot</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>Scene.v().releaseActiveHierarchy();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>Scene.v().releaseCallGraph();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>Scene.v().releaseFastHierarchy();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>Scene.v().releasePointsToAnalysis();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>Scene.v().releaseReachableMethods();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>Scene.v().releaseSideEffectAnalysis();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>G.reset();</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>// setup soot args</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>List&lt;String&gt; sootArgs = new LinkedList&lt;String&gt;();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>// analyze entire directory</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>sootArgs.add(&quot;-process-dir&quot;); </div><div><span class="Apple-tab-span" style="white-space:pre">                </span>sootArgs.add(projectDir);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>sootArgs.add(&quot;-w&quot;); // enable whole program mode</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>// setup spark options</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>sootArgs.add(&quot;-p&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>sootArgs.add(&quot;cg.paddle&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>sootArgs.add(&quot;enabled:true,verbose:true&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>// run soot</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>try {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>String[] argsArray = sootArgs.toArray(new String[0]);</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>soot.Main.main(argsArray);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span></div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>// iterate over call graph results</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>CallGraph callGraph = Scene.v().getCallGraph();</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>System.out.println(&quot;Number of edges in callgraph: &quot; + callGraph.size());</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span></div><div>//<span class="Apple-tab-span" style="white-space:pre">                        </span>PointsToAnalysis p = Scene.v().getPointsToAnalysis();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>} catch (Throwable t){</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>System.out.println(&quot;Soot class path &quot; + Scene.v().getSootClassPath());</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>t.printStackTrace();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span></div><div>}</div></div><div><br></div><div>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?<br></div><div><br></div><div><div>PaddleTransformer pt = new PaddleTransformer();</div><div>PaddleOptions paddle_opt = new PaddleOptions(myPaddleOptions);</div><div>pt.setup(paddle_opt);</div><div>pt.solve(paddle_opt);</div><div>soot.jimple.paddle.Results.v().makeStandardSootResults();</div></div><div><br></div><div>~Ben</div><div><br></div></div>