烟灰:源文件更改后重新加载类



我正在编写一个IntelliJ插件来分析java程序代码。因此,我使用烟灰来编写静态分析。每次用户触发我的插件的分析操作时,我都会像这样获取当前上下文的当前VirtualFile

FileEditorManager manager = FileEditorManager.getInstance(e.getProject());
VirtualFile files[] = manager.getSelectedFiles();
toAnalyse = files[0]; [...]

当我检查此文件的内容时,将应用所有更改。在此之后,我正在加载我想在烟灰中分析的类。

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*/

这对我来说非常有效。但是现在谈谈我的问题:如果我换了。在我的插件的测试实例中并再次触发相同的分析,没有任何变化。

到目前为止,我尝试了什么?

我设置了以下选项

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

并再次启动程序。

我解决了这个问题。

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_Scene在打电话给G.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;
}

返回具有空结果缓存的新实例。

相关内容

  • 没有找到相关文章

最新更新