Domanda

Voglio usare fuliggine per eseguire un'analisi statica dei programmi Java, incluso per esempioIl grafico del flusso di controllo

i vari tutorials Dì che il "modo standard" per utilizzare il fuliggine èCreare un metodo principale in cui si aggiunge trasformazioni personalizzate alla pipeline di fuliggine e quindi chiamare soot.main.main (...) :

public static void main(String[] args) {        
    PackManager.v().getPack("jtp").add(
         new Transform("jtp.gotoinstrumenter", GotoInstrumenter.v()));
    soot.Main.main(args);
}
.

Certo, questo ha alcuni limiti gravi se si desidera utilizzare la fuliggine in qualcos'altro che uno strumento di riga di comando.Ad esempio, non è chiaro per me se è persino legale chiamare il metodo principale di fuliggine più di una volta in un programma.

Così qualcuno conosce la possibilità di utilizzare gli strumenti di analisi dei fuligini direttamente attraverso un'API un po 'più sofisticata?

È stato utile?

Soluzione

La risposta è sì.Nel tuo principale puoi impostare la classe con:

configure("../yourClasspath/");
SootClass sootClass = Scene.v().loadClassAndSupport("className");
sootClass.setApplicationClass();

// Retrieve the method and its body
SootMethod m = c.getMethodByName("methodName");
Body b = m.retrieveActiveBody();

// Instruments bytecode
new YourTransform().transform(b);
.

Successivamente, potresti costruire il CFG ed eseguire una certa analisi.

Segue il metodo Configura:

public static void configure(String classpath) {

        Options.v().set_verbose(false);
        Options.v().set_keep_line_number(true);
        Options.v().set_src_prec(Options.src_prec_class);
        Options.v().set_soot_classpath(classpath);
        Options.v().set_prepend_classpath(true);

        PhaseOptions.v().setPhaseOption("bb", "off");
        PhaseOptions.v().setPhaseOption("tag.ln", "on");
        PhaseOptions.v().setPhaseOption("jj.a", "on");
        PhaseOptions.v().setPhaseOption("jj.ule", "on");

        Options.v().set_whole_program(true);
    }
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top