Javaプログラムコードを解析するIntelliJ-Pluginを作成しています。したがって、私はSootを使って静的解析を書いています。ユーザーが私のプラグインの分析・アクションをトリガーするたびに、私はこのような現在のコンテキストの現在のVirtualFile
を取る:私は、このファイルの内容を確認するときSoot:ソースファイル変更後のリロードクラス
FileEditorManager manager = FileEditorManager.getInstance(e.getProject());
VirtualFile files[] = manager.getSelectedFiles();
toAnalyse = files[0]; [...]
すべての変更が適用されます。この後、私はSootで分析したいクラスをロードしています。
String dir = toAnalyse.getParent().getPath() ;
Options.v().setPhaseOption("jb", "use-original-names");
Options.v().set_soot_classpath(System.getProperty("java.home")+";"+ dir);
c = Scene.v().loadClassAndSupport(name);
/*no analyse c*/
これは完全に機能します。しかし今私の問題に: 私はsthを変更します。私のプラグインのテストインスタンスで、同じ分析を再度トリガーしますが、何も変わりません。
私はこれまで何を試みましたか?
私は、次のオプション設定:
Options.v().set_dump_body(Arrays.asList("jb"));
Options.v().set_dump_cfg(Arrays.asList("jb"));
Options.v().set_allow_phantom_refs(true);
Options.v().set_whole_program(true);
を私はまた、このように手で
をすべてのクラスを削除:
Chain<SootClass> classes = Scene.v().getClasses();
Stack<SootClass> stack = new Stack<>();
for(SootClass s : classes)
stack.push(s);
while(!stack.empty())
Scene.v().removeClass(stack.pop());
して、再度プログラムを開始しました。