2017-06-08 8 views
6

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

して、再度プログラムを開始しました。

答えて

5

私はこの問題を解決しました。

SootClass c = Scene.v().loadClassAndSupport(name); 
// ... 
c.setResolvingLevel(0); 
G.reset(); 

G.reset()リセットして、すべてのシングルトンインスタンス。 したがって、このアクションを再度呼び出すと、キャッシュされた結果はすべて上書きされます。

public static Scene v() { 
    return G.v().soot_Scene(); 
} 

this.instance_soot_SceneG.reset()を呼び出した後nullです。

したがって、次のコード:

public Scene soot_Scene() { 
    if(this.instance_soot_Scene == null) { 
     synchronized(this) { 
      if(this.instance_soot_Scene == null) { 
       this.instance_soot_Scene = new Scene(this.g); 
      } 
     } 
    } 

    return this.instance_soot_Scene; 
} 

は、空の結果キャッシュとの新しいインスタンスを返します。

関連する問題