<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<String> argList = new
ArrayList<String>(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<Integer,Integer> outMap = new
HashMap<Integer,Integer>();
<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<SootClass> 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<SootMethod> 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() &&
!m.isConstructor()){
<br>
<br>
Iterator<MethodOrMethodContext>
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<String,String> opt = new
HashMap<String,String>();
<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>