<html><body><div style="color:#000; background-color:#fff; font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:10px"><div id="yui_3_16_0_1_1430760840507_8384">  Hi,<br>I'm trying to compute the call graph of a simple application, with the aid of averroes and SPARK (I'm using the JDK 7 Update 79 on Windows 64-bit).<br>My input application consists of two jars:<br>&nbsp;- TracingTest.jar<br>&nbsp;- Annotations.jar, referred by TracingTest.jar</div><div id="yui_3_16_0_1_1430760840507_8406"><br></div><div id="yui_3_16_0_1_1430760840507_8389">I've managed to run averroes which generates the usual jars (organizedApplication / organizedLibrary / placeholderLibrary).<br>However, when I try to compute the call graph with SPARK, an exception is thrown:</div><div id="yui_3_16_0_1_1430760840507_8429"><br></div><div id="yui_3_16_0_1_1430760840507_8390">&nbsp;No main class given. Inferred 'Main' as main class.<br>&nbsp;[Call Graph] For information on where the call graph may be incomplete, use the verbose option to the cg phase.<br>&nbsp;Exception in thread "main" soot.AbstractSootFieldRef$FieldResolutionFailedException: Class java.lang.System doesn't have field err : java.io.PrintStream; failed to resolve in superclasses and interfacesLooking in java.lang.System which has fields [&lt;java.lang.System: java.io.PrintStream out&gt;]<br>&nbsp;Looking in java.lang.Object which has fields []</div><div id="yui_3_16_0_1_1430760840507_8391">&nbsp;&nbsp;at soot.AbstractSootFieldRef.resolve(AbstractSootFieldRef.java:116)<br>&nbsp;&nbsp;at soot.AbstractSootFieldRef.resolve(AbstractSootFieldRef.java:75)<br>&nbsp;<br>&nbsp;&nbsp;[... snip ...]</div><div id="yui_3_16_0_1_1430760840507_8458"><br></div><div id="yui_3_16_0_1_1430760840507_8392">&nbsp;&nbsp;at soot.jimple.spark.SparkTransformer.internalTransform(SparkTransformer.java:84)<br>&nbsp;&nbsp;at soot.SceneTransformer.transform(SceneTransformer.java:39)<br>&nbsp;&nbsp;at main.main(main.java:62)<br>&nbsp;Picked up _JAVA_OPTIONS: -Xmx1200m -Xms256m</div><div id="yui_3_16_0_1_1430760840507_8420"><br></div><div id="yui_3_16_0_1_1430760840507_8393">I use the following code to invoke SPARK:</div><div id="yui_3_16_0_1_1430760840507_8421"><br></div><div id="yui_3_16_0_1_1430760840507_8394">&nbsp;import java.io.File;<br>&nbsp;import java.io.FileNotFoundException;<br>&nbsp;import java.util.HashMap;</div><div id="yui_3_16_0_1_1430760840507_8383">&nbsp;import soot.G;<br>&nbsp;import soot.Scene;<br>&nbsp;import soot.SootClass;<br>&nbsp;import soot.jimple.spark.SparkTransformer;<br>&nbsp;import soot.jimple.toolkits.callgraph.CallGraph;<br>&nbsp;import soot.options.Options;<br>&nbsp;<br>&nbsp;public class main <br>&nbsp;{<br>&nbsp;&nbsp;public static void configure(String classpath) <br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Options.v().set_verbose(false);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Options.v().set_keep_line_number(true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Options.v().set_src_prec(Options.src_prec_only_class);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Options.v().set_soot_classpath(classpath);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Options.v().set_prepend_classpath(true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Options.v().set_allow_phantom_refs(true);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Options.v().set_whole_program(true);<br>&nbsp;&nbsp;}<br>&nbsp;<br>&nbsp;&nbsp;public static void main(String[] args) throws FileNotFoundException <br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;G.reset();<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;// code copied from Scene.getDefaultClasspath<br>&nbsp;&nbsp;&nbsp;StringBuffer sb = new StringBuffer();&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;sb.append("D:\\averroes\\TracingTest\\output\\organizedApplication.jar");<br>&nbsp;&nbsp;&nbsp;sb.append(File.pathSeparator);<br>&nbsp;&nbsp;&nbsp;sb.append("D:\\averroes\\TracingTest\\output\\placeholderLibrary.jar");</div><div>&nbsp;&nbsp;&nbsp;configure(sb.toString());<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;// Do not load standard JRE classes<br>&nbsp;&nbsp;&nbsp;// Scene.v().loadBasicClasses();</div><div>&nbsp;&nbsp;&nbsp;SootClass sootClass = Scene.v().forceResolve("Main", SootClass.BODIES);<br>&nbsp;&nbsp;&nbsp;sootClass.setApplicationClass();</div><div id="yui_3_16_0_1_1430760840507_8407">&nbsp;&nbsp;&nbsp;// Do not load standard JRE classes<br>&nbsp;&nbsp;&nbsp;// Scene.v().loadNecessaryClasses();<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;// CHA<br>&nbsp;&nbsp;&nbsp;//CHATransformer.v().transform();<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;// SPARK<br>&nbsp;&nbsp;&nbsp;HashMap&lt;String, String&gt; opt = new HashMap&lt;String, String&gt;();&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;opt.put("enabled", "true");<br>&nbsp;&nbsp;&nbsp;opt.put("verbose", "true");<br>&nbsp;&nbsp;&nbsp;opt.put("propagator", "worklist");<br>&nbsp;&nbsp;&nbsp;opt.put("simple-edges-bidirectional", "false");<br>&nbsp;&nbsp;&nbsp;opt.put("on-fly-cg", "true");<br>&nbsp;&nbsp;&nbsp;opt.put("set-impl", "double");<br>&nbsp;&nbsp;&nbsp;opt.put("double-set-old", "hybrid");<br>&nbsp;&nbsp;&nbsp;opt.put("double-set-new", "hybrid");<br>&nbsp;&nbsp;&nbsp;opt.put("whole-program", "true");<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;SparkTransformer.v().transform("", opt);<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;CallGraph g = Scene.v().getCallGraph();<br>&nbsp;&nbsp;}<br>&nbsp;}<br>}</div><div id="yui_3_16_0_1_1430760840507_8408"><br></div><div id="yui_3_16_0_1_1430760840507_8409">The System.class file generated by averroes does not contain the System.err field indeed:</div><div id="yui_3_16_0_1_1430760840507_8410"><br></div><div id="yui_3_16_0_1_1430760840507_8411">&nbsp;/* compiled from Jasmin */</div><div id="yui_3_16_0_1_1430760840507_8412">&nbsp;public final static java.io.PrintStream out;</div><div id="yui_3_16_0_1_1430760840507_8413">&nbsp;public System() <br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;0 aload_0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 invokespecial 19;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* java.lang.Object() */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 aload_0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 putstatic 26;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* ca.uwaterloo.averroes.Library.libraryPointsTo */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8 invokestatic 13;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* void ca.uwaterloo.averroes.Library.doItAll() */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;11 return;<br>&nbsp;}</div><div id="yui_3_16_0_1_1430760840507_8414"><br></div><div id="yui_3_16_0_1_1430760840507_8419">Is this a bug of averroes? If I don't use it and let SPARK analyze the real Java Runtime Library, I get no errors.<br>Here's a link to an archive containing all the relevant files:</div><div id="yui_3_16_0_1_1430760840507_8457"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a id="yui_3_16_0_1_1430760840507_8416" href="https://drive.google.com/file/d/0B1gS1nNBmRjaVTRhVWV4TE93NjQ">https://drive.google.com/file/d/0B1gS1nNBmRjaVTRhVWV4TE93NjQ</a></div><div id="yui_3_16_0_1_1430760840507_8452"><br></div><div dir="ltr">Thanks</div></div></body></html>