У меня нижеприведенная Java-программа
public class tester3 {
int bar1(int x) {
int a=10;
System.out.println(x+" "+a);
return 0;
}
}
У меня есть код драйвера, как показано ниже
Options.v().setPhaseOption("jb", "use-original-names:true");
Pack jtp=PackManager.v().getPack("jtp");
jtp.add(new Transform("jtp.instrumenter", new ReachingDefinitionWrapper()));
SootResolver.v().resolveClass("java.lang.CloneNotSupportedException", SootClass.SIGNATURES);
Options.v().set_output_format(Options.output_format_jimple);
Он генерирует следующий код Jimple
int bar1(int)
{
Assignment2.tester3 this;
int x;
byte a;
java.lang.StringBuilder $r0;
java.io.PrintStream $r1;
java.lang.String $r2, $r3;
this := @this: Assignment2.tester3;
x := @parameter0: int;
a = 10;
$r1 = <java.lang.System: java.io.PrintStream out>;
$r0 = new java.lang.StringBuilder;
$r2 = staticinvoke <java.lang.String: java.lang.String valueOf(int)>(x);
specialinvoke $r0.<java.lang.StringBuilder: void <init>(java.lang.String)>($r2);
$r0 = virtualinvoke $r0.<java.lang.StringBuilder: java.lang.StringBuilder append(java.lang.String)>(" ");
$r0 = virtualinvoke $r0.<java.lang.StringBuilder: java.lang.StringBuilder append(int)>(a);
$r3 = virtualinvoke $r0.<java.lang.StringBuilder: java.lang.String toString()>();
virtualinvoke $r1.<java.io.PrintStream: void println(java.lang.String)>($r3);
return 0;
}
Когдамы обрабатываем System.out.println(x+" "+a);
, мне нужно извлечь переменные x и y. Но так как jimple разбивает оператор на несколько строк, я не могу получить x и y непосредственно из оператора println. Как мне этого добиться?