Как сохранить оригинальные имена переменных в jimple (саже)? - PullRequest
0 голосов
/ 10 октября 2019

У меня нижеприведенная 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. Как мне этого добиться?

...