Как анализировать файлы .class с помощью сажи? - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь построить график вызовов (CG) для spotbugs-4.0.2 с сажей. Код показан следующим образом.

public static void main(String[] args) {

    String analyzed_classes_dir = "C:\\Users\\lyu\\lll\\src\\test\\java\\com\\demo\\dir3\\spotbugs"; //contains all structured class files
    String mainclass = "edu.umd.cs.findbugs.LaunchAppropriateUI";

    //set classpath
    String javapath = System.getProperty("java.class.path");
    String jredir = System.getProperty("java.home") + "\\lib\\rt.jar";
    String libs = "C:\\Users\\liuyu\\lll\\src\\test\\java\\com\\demo\\libs\\spotbugs-4.0.2\\";
    String path = javapath + File.pathSeparator + jredir + File.pathSeparator + libs;

    Scene.v().setSootClassPath(path);

    //add an intra-procedural analysis phase to Soot
    TestCallGraphSootJar_3 analysis = new TestCallGraphSootJar_3();
    PackManager.v().getPack("wjtp").add(new Transform("wjtp.TestSootCallGraph", analysis));

    excludeJDKLibrary();

    Options.v().set_process_dir(Arrays.asList(analyzed_classes_dir));
    Options.v().set_whole_program(true);
    Options.v().set_no_bodies_for_excluded(true);
    Options.v().set_allow_phantom_refs(true);

    Scene.v().loadNecessaryClasses();
    SootClass appclass = Scene.v().getSootClass(mainclass);
    Scene.v().setMainClass(appclass); // exception here.

    enableSparkCallGraph();

    PackManager.v().runPacks();
}

Затем исключение:

Exception in thread "main" java.lang.RuntimeException: Main-class has no main method!
at soot.Scene.setMainClass(Scene.java:187)
at com.ouc.TestCallGraphSootJar_3.main(TestCallGraphSootJar_3.java:65)

Оператор «Scene.v (). SetMainClass (appclass);» выбрасывает указанное выше исключение. Я отладил его и обнаружил, что methodlst в appclass имеет значение null. А appclass - фантом. Как показано на картинке. рис. информация об отладке appclass

mainclass действительно существует по указанному пути, и он содержит основной метод.

Я отправил проблему в GitHub (https://github.com/Sable/soot/issues/1346#issuecomment -627551137 ), но не решил. И руководство по опциям тоже не помогло с этой проблемой.

Кстати, могу ли я анализировать отношения вызовов только в данном классе? Например, я хочу получить информацию о вызове только внутри класса C1.

Class C1{
  main(){
    m1(parm);
  }

  m1(args){
    m2(xxx);
  }

  m2(args){
    m3(xxx);
  }

  m3(args){
    ...  
  }
}

Тогда я хочу получить только связь с последующим вызовом:

main——>m1()——>m2()——m3()

Если main или m1 или m2 или m3 вызывает метод в другом классе C2, я проигнорирую его, сосредоточусь только на методах в C1.

1 Ответ

0 голосов
/ 31 мая 2020

Я спрашиваю, и я решил это. Если вас интересует этот вопрос, вы можете прочитать его в этом выпуске post .

...