1

我目前正在开发一个程序,该程序将两个控制流图相互比较(这些图是用 Soot 生成的)。这些图属于两个不同的类别;所以每个人都有一个cfg。

目前我正在使用以下加载类:

   SootClass sClassNew = Scene.v().loadClassAndSupport("Calc");     
   sClassNew.setApplicationClass();

   SootClass sClassOld = Scene.v().loadClassAndSupport("Calc2");        
   sClassOld.setApplicationClass()

如果我通过右键单击项目添加一个包含 Calc.java 和 Calc2.java 类的文件夹,这将有效。Java 构建路径 | 添加外部类文件夹| 选择文件夹。

不幸的是,这并不是我想要的,因为:

  1. 这两个类将具有相同的名称,因为它们是彼此不同的版本。换句话说,一个类是另一个类的更新版本。
  2. 执行程序时,我想让用户能够选择文件以便构建 cfg。因此,我必须消除上述步骤以添加类,并且需要一种在运行时添加它们的方法。

一个重要的注意事项是,Soot 只会从在 Soot 的类路径中找到的 JAR 文件和目录中加载文件。有谁知道我该如何解决这两个问题?

4

1 回答 1

1

Soot 并没有真正准备好处理这个问题。它的主要数据结构是场景,其中包含它所推理的所有类,并且场景每个类名只能保存一个类实例——不可能有两个不同的版本。

话虽如此,我们最近为 Soot 构建了一个名为 Reviser 的扩展(目前正在提交中):https ://github.com/StevenArzt/reviser Reviser 逐步更新程序的跨过程控制流图和诱导的 IFDS/IDE 分析信息. 不过,为了完成这项工作,我们不得不对 Soot 的类加载机制进行大量研究。这远非微不足道。如果您对详细信息感兴趣,请发送个人邮件给 Steven Arzt 和我本人。

于 2013-12-01T11:52:28.547 回答