Soot:源文件更改后重新加载 class
Soot: Reload class after source-file changed
我正在编写一个 IntelliJ-Plugin 来分析 java-程序代码。因此我使用 Soot 来编写静态分析。每次用户触发我的插件的分析操作时,我都会像这样获取当前上下文的当前 VirtualFile
:
FileEditorManager manager = FileEditorManager.getInstance(e.getProject());
VirtualFile files[] = manager.getSelectedFiles();
toAnalyse = files[0]; [...]
当我检查此文件的内容时,所有更改都已应用。在此之后我正在加载 class 我想在 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*/
这非常适合我。但现在我的问题是:
如果我改变某事。在我的插件的测试实例中再次触发相同的分析,没有任何变化。
What have i tried so far?
我设置了以下选项:
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);
我还手动删除了所有 classes
像这样:
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;
}
returns 具有空结果缓存的新实例。
我正在编写一个 IntelliJ-Plugin 来分析 java-程序代码。因此我使用 Soot 来编写静态分析。每次用户触发我的插件的分析操作时,我都会像这样获取当前上下文的当前 VirtualFile
:
FileEditorManager manager = FileEditorManager.getInstance(e.getProject());
VirtualFile files[] = manager.getSelectedFiles();
toAnalyse = files[0]; [...]
当我检查此文件的内容时,所有更改都已应用。在此之后我正在加载 class 我想在 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*/
这非常适合我。但现在我的问题是: 如果我改变某事。在我的插件的测试实例中再次触发相同的分析,没有任何变化。
What have i tried so far?
我设置了以下选项:
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);
我还手动删除了所有 classes
像这样:
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;
}
returns 具有空结果缓存的新实例。