<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <p>
    </p>
    <div class="moz-text-flowed" style="font-family: -moz-fixed;
      font-size: 12px;" lang="x-unicode">Hi All,
      <br>
      <br>
      I am trying to see the results of Call Graph of vta on java
      programs having reflection classes. For this I used Tamiflex to
      resolve all the reflective calls in the java program. The output
      class files where then used as an argument to the Call graph
      analysis. Doing so resulted into the following exception.
      <br>
      <br>
      Exception in thread "main" java.lang.RuntimeException
      <br>
          at soot.jimple.spark.pag.MethodPAG.addToPAG(MethodPAG.java:62)
      <br>
          at
soot.jimple.spark.builder.ContextInsensitiveBuilder.build(ContextInsensitiveBuilder.java:91)<br>
          at
soot.jimple.spark.SparkTransformer.internalTransform(SparkTransformer.java:84)<br>
          at soot.SceneTransformer.transform(SceneTransformer.java:39)
      <br>
          at RTAMeasures$1.setSparkAnalysis(RTAMeasures.java:105)
      <br>
          at RTAMeasures$1.internalTransform(RTAMeasures.java:57)
      <br>
          at soot.SceneTransformer.transform(SceneTransformer.java:39)
      <br>
          at soot.Transform.apply(Transform.java:89)
      <br>
          at soot.ScenePack.internalApply(ScenePack.java:43)
      <br>
          at soot.Pack.apply(Pack.java:114)
      <br>
          at soot.PackManager.runWholeProgramPacks(PackManager.java:418)
      <br>
          at soot.PackManager.runPacks(PackManager.java:336)
      <br>
          at soot.Main.run(Main.java:198)
      <br>
          at soot.Main.main(Main.java:141)
      <br>
          at RTAMeasures.main(RTAMeasures.java:111)
      <br>
      <br>
      <br>
      Command I used for using Tamiflex:
      <br>
      java -javaagent:poa-2.0.3.jar ReflectionDemo
      <br>
      <br>
      then I used the following command.
      <br>
       java -cp soot-2.5.0.jar soot.Main -w -app -allow-phantom-refs -p
      cg.spark enabled -cp
      $JAVA_HOME/lib/rt.jar:$JAVA_HOME/lib/jce.jar:out:. -include
      org.apache. -include org.w3c. -main-class ReflectionDemo SomeClass
      ReflectionDemo
      <br>
      <br>
      The class file in sootOuptut directory was used as the input to
      the program that prints the call graph edges.
      <br>
      <br>
      <br>
      Reflection Example in JAVA.
      <br>
---------------------------ReflectionDemo.java--------------------------------------------------
      <br>
      import java.lang.reflect.*;
      <br>
      public class ReflectionDemo {
      <br>
      <br>
        public static void main(String[] args) throws
      ClassNotFoundException,
      <br>
          NoSuchMethodException, SecurityException,
      InstantiationException,
      <br>
          IllegalAccessException, IllegalArgumentException,
      InvocationTargetException {
      <br>
              // TODO Auto-generated method stub
      <br>
      <br>
              Class c = Class.forName("SomeClass");
      <br>
              Method m = c.getDeclaredMethod("SomeMethod");
      <br>
      <br>
              Object o = c.newInstance();
      <br>
              m.invoke(o, null);
      <br>
          }
      <br>
      <br>
      }
      <br>
      <br>
---------------------------SomeClass.java--------------------------------------------------
      <br>
      public class SomeClass {
      <br>
      <br>
          public SomeClass(){}
      <br>
      <br>
          public void SomeMethod(){
      <br>
              System.out.println("Some Method is called ");
      <br>
          }
      <br>
      }
      <br>
      <br>
      And the analysis I am trying out.
      <br>
      <br>
---------------------------RTAMeasures.java--------------------------------------------------
      <br>
      <br>
      public class RTAMeasures {
      <br>
          public static void main(String[] args) {
      <br>
              List&lt;String&gt; argList = new
      ArrayList&lt;String&gt;(Arrays.asList(args));
      <br>
              argList.addAll(Arrays.asList(new String[]{
      <br>
                          "-w",
      <br>
      "-cp","/home/mandar/MTP/Impl/classes/sootOutput",
      <br>
                          "-allow-phantom-refs",
      <br>
                          "-main-class",
      <br>
                          "ReflectionDemo",
      <br>
                          "ReflectionDemo"
      <br>
                          }));
      <br>
      <br>
      <br>
      <br>
              PackManager.v().getPack("wjtp").add(new
      Transform("wjtp.myTrans",
      <br>
                      new SceneTransformer() {
      <br>
      <br>
                  @Override
      <br>
                  protected void internalTransform(String arg0, Map
      arg1) {
      <br>
      <br>
                      HashMap&lt;Integer,Integer&gt; outMap = new
      HashMap&lt;Integer,Integer&gt;();
      <br>
                      Scene.v().loadNecessaryClasses();
      <br>
      <br>
                      setSparkAnalysis();
      <br>
      <br>
      <br>
                      CallGraph cg = Scene.v().getCallGraph();
      <br>
                      System.out.println("Call graph size :
      "+cg.size());
      <br>
      <br>
                      Iterator methods = cg.sourceMethods();
      <br>
      <br>
                      PrintStream out = null;
      <br>
                      try {
      <br>
                          out = new PrintStream(new
      FileOutputStream("logs/vta.txt"));
      <br>
                      } catch (FileNotFoundException e) {
      <br>
                          e.printStackTrace();
      <br>
                      }
      <br>
      <br>
                      Iterator&lt;SootClass&gt; itc =
      Scene.v().getClasses().iterator();
      <br>
                      while(itc.hasNext()){
      <br>
                          SootClass sC = (SootClass)itc.next();
      <br>
                          out.println("\t\tClass Name:  " +
      sC.getName());
      <br>
      <br>
                          Iterator&lt;SootMethod&gt; methodIt =
      sC.getMethods().iterator();
      <br>
      <br>
                          while(methodIt.hasNext()){
      <br>
                              SootMethod m = (SootMethod)
      methodIt.next();
      <br>
                              out.println("\t\tMethod Name:
      "+m.getName());
      <br>
                              if(!m.isJavaLibraryMethod() &amp;&amp;
      !m.isConstructor()){
      <br>
      <br>
                                  Iterator&lt;MethodOrMethodContext&gt;
      targets = new Targets(cg.edgesOutOf(m));
      <br>
                                  while (targets.hasNext()) {
      <br>
                                         SootMethod tgt =
      (SootMethod)targets.next();
      <br>
                                         out.println(m + " may call " +
      tgt);
      <br>
                                  }
      <br>
                              }
      <br>
                          }
      <br>
                      }
      <br>
                  }
      <br>
      <br>
                  private void setSparkAnalysis() {
      <br>
                      HashMap&lt;String,String&gt; opt = new
      HashMap&lt;String,String&gt;();
      <br>
                      opt.put("enabled","true");
      <br>
                      opt.put("verbose","false");
      <br>
                      opt.put("vta","true");
      <br>
                      opt.put("on-fly-cg","true");
      <br>
                      opt.put("set-impl","double");
      <br>
                      opt.put("double-set-old","hybrid");
      <br>
                      opt.put("propagator", "iter");
      <br>
                      opt.put("double-set-new","hybrid");
      <br>
      <br>
                      SparkTransformer.v().transform("",opt);
      <br>
                  }
      <br>
              }));
      <br>
      <br>
              args = argList.toArray(new String[0]);
      <br>
      <br>
              soot.Main.main(args);
      <br>
          }
      <br>
      }
      <br>
      <br>
      Please let me know what are the steps I have done wrong. I am
      using Tamiflex for the first time.
      <br>
      <br>
      Thanks in advance.
      <br>
      <br>
      Regards,
      <br>
      Mandar.
      <br>
    </div>
  </body>
</html>