Hello everybody,
I am trying to write a program that takes a java class file...converts it into corresponding jimple code and prints out the jimple statements along with their line numbers. Then I would like to pick out those lines from the jimple code which have a "virtual invoke". The code that I have written looks like below:
import soot.*; import java.util.*; import soot.util.*; import soot.jimple.Stmt; import soot.tagkit.LineNumberTag; import soot.baf.*; import java.io.*; public class GetStmts4 extends BodyTransformer implements RetInst { private static GetStmts4 instance = new GetStmts4(); private GetStmts4() {}; public static GetStmts4 v() { return instance; } public static void main(String args[]) { soot.options.Options.v().set_keep_line_number(true); //soot.options.Options.v().set_whole_program(true); //soot.options.Options.v().setPhaseOption("cg","verbose:true"); PackManager.v().getPack("jtp").add(new Transform ("jtp.annotexample",GetStmts4.v())); soot.Main.main(args); } protected void internalTransform(Body b, String phaseName, Map options) { int linenum = 0; int count = 0; int array[] = new int[20]; PatchingChain units = b.getUnits(); Iterator unitsIt = units.iterator(); while(unitsIt.hasNext()) { Unit unit = (Unit)unitsIt.next(); LineNumberTag tag = (LineNumberTag) unit.getTag("LineNumberTag"); int index = rt.getIndex(); //to get the index of the jimple line??is this correct?? System.out.println("Index is :" + index); System.out.println(unit); if (tag != null) //wrote the following piece of code but it gives me the line number in the source code...and not the jimple line number { System.out.println("java line number:"+tag.getLineNumber()); //System.out.println("tag name:"+tag.getName()); String string = unit.toString(); if(string.matches("\\s*.*virtualinvoke.*")) { count++; System.out.println("line number with virtualinvoke:"+tag.getLineNumber()); array[count] = tag.getLineNumber(); System.out.println("the " +count+ " element in array is : " +array[count]); } } } for(int k = 1;k <= count; k++) { System.out.println(array[k]); } } }
I am getting the following error:
GetStmts4.java:9: GetStmts4 is not abstract and does not override abstract method setIndex(int) in soot.baf.RetInst
public class GetStmts4 extends BodyTransformer implements RetInst
^
Would be really grateful if somebody could help me out with this.
Thanks!!!