我目前正在编写一个程序,该程序将两个控制流图相互比较(这些图是用Soot生成的)。这些图属于两个不同的类别;因此每个cfg一个。
目前我正在使用以下加载类:
SootClass sClassNew = Scene.v().loadClassAndSupport("Calc");
sClassNew.setApplicationClass();
SootClass sClassOld = Scene.v().loadClassAndSupport("Calc2");
sClassOld.setApplicationClass()
如果我通过右键单击项目|java Build Path|add External Class folder|选择文件夹来添加一个包含Calc.java和Calc2.java类的文件夹,则此操作有效。
不幸的是,这并不是我想要的,因为:
- 这两个类将具有相同的名称,因为它们是彼此的不同版本。换句话说,一个类是另一个类的更新版本
- 当程序被执行时,我想让用户能够选择文件,以便构建cfg。因此,我必须消除上述步骤,以便添加类,并需要一种在运行时添加它们的方法
一个重要的注意事项是,Soot只会从Soot类路径上的JAR文件和目录中加载文件。有人知道我该如何解决这两个问题吗?
Soot并没有真正设置来处理这个问题。它的主要数据结构是Scene,其中包含它推理的所有类,并且场景每个类名只能包含一个类实例——不能有两个不同的版本。
话虽如此,我们最近为Soot构建了一个名为Reviser的扩展(目前正在提交中):https://github.com/StevenArzt/reviserReviser逐步更新程序的过程间控制流图和引发的IFDS/IDE分析信息。然而,为了实现这一点,我们不得不反复研究Soot的类加载机制;这绝非小事。如果您对详细信息感兴趣,请给Steven Arzt和我本人发一封私人邮件。