Question

Je veux utiliser SOOT pour une analyse statique des programmes Java, y compris par exemplele graphe de contrôle de contrôle.

Les différents tutoriels disent que la "voie standard" d'utiliser la suie est deCréez une méthode principale où l'on ajoute des transformations personnalisées sur le pipeline de suie puis appelle SOOT.MAIN.MAIN (...) :

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

Bien sûr, cela a des limitations sérieuses si vous souhaitez utiliser la suie dans quelque chose d'autre qu'un outil de ligne de commande.Par exemple, il n'est pas clair pour moi de savoir s'il est même légal d'appeler la méthode principale de la SOOT plus d'une fois dans un programme.

Est-ce que quelqu'un connaît une possibilité d'utiliser les outils d'analyse de la suie directement via une API un peu plus sophistiqué?

Était-ce utile?

La solution

La réponse est oui.Dans votre principal, vous pouvez configurer la classe avec laquelle vous travaillez avec:

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);

Après cela, vous pourriez créer le CFG et exécuter une analyse.

Il suit la méthode de configuration:

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);
    }

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top