Hello everybody,
I am trying to write a piece of java code that will convert a java class to jimple, print the jimple code along withe the line numbers and then give the line numbers for lines with "virtual invoke".
The code that I have written so far 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");
RetInst rt = (RetInst)unit;
int index = rt.getIndex(); // to get the index of the jimple lines ???
System.out.println("Index is :" + index);
System.out.println(unit);
if (tag != null)
//the following piece of code gives me the line number but its in the java source code....i need the line numbers of jimple code.
{
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]);
}
}
}
So I am getting the following error message:
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
Thanks!!