Использование сажи и тамифлекса для отражающих звонков в JAVA

Я пытаюсь увидеть результаты Call Graph VTA на Java-программах, имеющих классы отражения. Для этого я использовал Tamiflex для разрешения всех отражающих вызовов в Java-программе. Выходные файлы классов, которые затем используются в качестве аргумента для анализа графа вызовов. Это привело к следующему исключению.

Exception in thread "main" java.lang.RuntimeException
    at soot.jimple.spark.pag.MethodPAG.addToPAG(MethodPAG.java:62)
    at soot.jimple.spark.builder.ContextInsensitiveBuilder.build(ContextInsensitiveBuilder.java:91)
    at soot.jimple.spark.SparkTransformer.internalTransform(SparkTransformer.java:84)
    at soot.SceneTransformer.transform(SceneTransformer.java:39)
    at RTAMeasures$1.setSparkAnalysis(RTAMeasures.java:105)
    at RTAMeasures$1.internalTransform(RTAMeasures.java:57)
    at soot.SceneTransformer.transform(SceneTransformer.java:39)
    at soot.Transform.apply(Transform.java:89)
    at soot.ScenePack.internalApply(ScenePack.java:43)
    at soot.Pack.apply(Pack.java:114)
    at soot.PackManager.runWholeProgramPacks(PackManager.java:418)
    at soot.PackManager.runPacks(PackManager.java:336)
    at soot.Main.run(Main.java:198)
    at soot.Main.main(Main.java:141)
    at RTAMeasures.main(RTAMeasures.java:111)

Команда, которую я использовал для использования Tamiflex:

java -javaagent: poa-2.0.3.jar ReflectionDemo

Затем я использовал следующую команду.

java -cp soot-2.5.0.jar soot.Main -w -app -allow-phantom-refs -p cg.spark включен -cp $JAVA_HOME/lib/rt.jar:$JAVA_HOME/lib/jce.jar:out:. -включить org.apache. -включить орг.w3c. -основной класс ReflectionDemo SomeClass ReflectionDemo

Файл класса в каталоге sootOuptut использовался в качестве входных данных для программы, которая печатает ребра графа вызовов.

Пример отражения в JAVA. --------------------------- ReflectionDemo.java -------------------- ------------------------------

import java.lang.reflect.*;
public class ReflectionDemo {

  public static void main(String[] args) throws ClassNotFoundException,
    NoSuchMethodException, SecurityException, InstantiationException,
    IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        // TODO Auto-generated method stub

        Class c = Class.forName("SomeClass");
        Method m = c.getDeclaredMethod("SomeMethod");

        Object o = c.newInstance();
        m.invoke(o, null);
    }

}

--------------------------- SomeClass.java -------------------- ------------------------------

public class SomeClass {

    public SomeClass(){}

    public void SomeMethod(){
        System.out.println("Some Method is called ");
    }
}

И код для анализа.

--------------------------- RTAMeasures.java -------------------- ------------------------------

public class RTAMeasures {
    public static void main(String[] args) {
        List<String> argList = new ArrayList<String>(Arrays.asList(args));
        argList.addAll(Arrays.asList(new String[]{
                    "-w",
"-cp","/home/mandar/MTP/Impl/classes/sootOutput",
                    "-allow-phantom-refs",
                    "-main-class",
                    "ReflectionDemo",
                    "ReflectionDemo"
                    }));



        PackManager.v().getPack("wjtp").add(new Transform("wjtp.myTrans",
                new SceneTransformer() {

            @Override
            protected void internalTransform(String arg0, Map arg1) {

                HashMap<Integer,Integer> outMap = new HashMap<Integer,Integer>();
                Scene.v().loadNecessaryClasses();

                setSparkAnalysis();


                CallGraph cg = Scene.v().getCallGraph();
                System.out.println("Call graph size : "+cg.size());

                Iterator methods = cg.sourceMethods();

                PrintStream out = null;
                try {
                    out = new PrintStream(new FileOutputStream("logs/vta.txt"));
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }

                Iterator<SootClass> itc = Scene.v().getClasses().iterator();
                while(itc.hasNext()){
                    SootClass sC = (SootClass)itc.next();
                    out.println("\t\tClass Name:  " + sC.getName());

                    Iterator<SootMethod> methodIt = sC.getMethods().iterator();

                    while(methodIt.hasNext()){
                        SootMethod m = (SootMethod) methodIt.next();
                        out.println("\t\tMethod Name: "+m.getName());
                        if(!m.isJavaLibraryMethod() && !m.isConstructor()){

                            Iterator<MethodOrMethodContext> targets = new Targets(cg.edgesOutOf(m));
                            while (targets.hasNext()) {
                                   SootMethod tgt = (SootMethod)targets.next();
                                   out.println(m + " may call " + tgt);
                            }
                        }
                    }
                }
            }

            private void setSparkAnalysis() {
                HashMap<String,String> opt = new HashMap<String,String>();
                opt.put("enabled","true");
                opt.put("verbose","false");
                opt.put("vta","true");
                opt.put("on-fly-cg","true");
                opt.put("set-impl","double");
                opt.put("double-set-old","hybrid");
                opt.put("propagator", "iter");
                opt.put("double-set-new","hybrid");

                SparkTransformer.v().transform("",opt);
            }
        }));

        args = argList.toArray(new String[0]);

        soot.Main.main(args);
    }
}

Пожалуйста, дайте мне знать, какие шаги я сделал неправильно. Я использую Тамифлекс в первый раз.

Заранее спасибо.

С Уважением,

Mandar.

0 ответов

Другие вопросы по тегам