<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> - TracingTest.jar<br> - 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"> No main class given. Inferred 'Main' as main class.<br> [Call Graph] For information on where the call graph may be incomplete, use the verbose option to the cg phase.<br> 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 [<java.lang.System: java.io.PrintStream out>]<br> Looking in java.lang.Object which has fields []</div><div id="yui_3_16_0_1_1430760840507_8391"> at soot.AbstractSootFieldRef.resolve(AbstractSootFieldRef.java:116)<br> at soot.AbstractSootFieldRef.resolve(AbstractSootFieldRef.java:75)<br> <br> [... snip ...]</div><div id="yui_3_16_0_1_1430760840507_8458"><br></div><div id="yui_3_16_0_1_1430760840507_8392"> at soot.jimple.spark.SparkTransformer.internalTransform(SparkTransformer.java:84)<br> at soot.SceneTransformer.transform(SceneTransformer.java:39)<br> at main.main(main.java:62)<br> 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"> import java.io.File;<br> import java.io.FileNotFoundException;<br> import java.util.HashMap;</div><div id="yui_3_16_0_1_1430760840507_8383"> import soot.G;<br> import soot.Scene;<br> import soot.SootClass;<br> import soot.jimple.spark.SparkTransformer;<br> import soot.jimple.toolkits.callgraph.CallGraph;<br> import soot.options.Options;<br> <br> public class main <br> {<br> public static void configure(String classpath) <br> {<br> Options.v().set_verbose(false);<br> Options.v().set_keep_line_number(true);<br> Options.v().set_src_prec(Options.src_prec_only_class);<br> Options.v().set_soot_classpath(classpath);<br> Options.v().set_prepend_classpath(true);<br> Options.v().set_allow_phantom_refs(true); <br> Options.v().set_whole_program(true);<br> }<br> <br> public static void main(String[] args) throws FileNotFoundException <br> {<br> G.reset();<br> <br> // code copied from Scene.getDefaultClasspath<br> StringBuffer sb = new StringBuffer(); <br> sb.append("D:\\averroes\\TracingTest\\output\\organizedApplication.jar");<br> sb.append(File.pathSeparator);<br> sb.append("D:\\averroes\\TracingTest\\output\\placeholderLibrary.jar");</div><div> configure(sb.toString());<br> <br> // Do not load standard JRE classes<br> // Scene.v().loadBasicClasses();</div><div> SootClass sootClass = Scene.v().forceResolve("Main", SootClass.BODIES);<br> sootClass.setApplicationClass();</div><div id="yui_3_16_0_1_1430760840507_8407"> // Do not load standard JRE classes<br> // Scene.v().loadNecessaryClasses();<br> <br> // CHA<br> //CHATransformer.v().transform();<br> <br> // SPARK<br> HashMap<String, String> opt = new HashMap<String, String>(); <br> opt.put("enabled", "true");<br> opt.put("verbose", "true");<br> opt.put("propagator", "worklist");<br> opt.put("simple-edges-bidirectional", "false");<br> opt.put("on-fly-cg", "true");<br> opt.put("set-impl", "double");<br> opt.put("double-set-old", "hybrid");<br> opt.put("double-set-new", "hybrid");<br> opt.put("whole-program", "true");<br> <br> SparkTransformer.v().transform("", opt);<br> <br> CallGraph g = Scene.v().getCallGraph();<br> }<br> }<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"> /* compiled from Jasmin */</div><div id="yui_3_16_0_1_1430760840507_8412"> public final static java.io.PrintStream out;</div><div id="yui_3_16_0_1_1430760840507_8413"> public System() <br> {<br> 0 aload_0;<br> 1 invokespecial 19; /* java.lang.Object() */<br> 4 aload_0;<br> 5 putstatic 26; /* ca.uwaterloo.averroes.Library.libraryPointsTo */<br> 8 invokestatic 13; /* void ca.uwaterloo.averroes.Library.doItAll() */<br> 11 return;<br> }</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> <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>