Soot - 如何防止loadClassAndSupport创建一个空的SootClass?

时间:2013-06-13 08:13:03

标签: java soot

使用soot框架(v.2.5.0)我正在尝试加载某个类:

SootClass clazz = Scene.v().loadClassAndSupport("example.MyClass");

在致电Scene#loadClassAndSupport之前,课程example.MyClass不在场景中 - 这是正确的 该类在soot类路径中也不存在,并且上面的语句抛出一个RuntimeException,告诉该类无法找到。这也是正确的行为。

但是在抛出异常之后,班级example.MyClass就在烟灰的场景中! 因此,对Scene#loadClassAndSupport的另一次调用会返回SootClass个实例,其中isPhantom设置为false,但它没有任何方法或字段。

  1. 这种行为是由soot框架实现的,还是一个bug?
  2. 如果打算这样做,我怎样才能阻止Soot在场景中添加“虚拟”SootClass?
  3. 是否有其他方法可以测试某个类是否在Soot的类路径中而不将其添加到Soot的场景中?
  4. 更新
    一个丑陋但有效的解决方法是:

    try {
      SootClass sootClass = Scene.v().loadClassAndSupport( className );
      sootClass.setApplicationClass();
      // class found and loaded...
    } catch(RuntimeException e) {
      SootClass sootClass = Scene.v().loadClassAndSupport( className );
      Scene.v().removeClass( sootClass );
      // class not on soot's classpath or not loadable...
    }
    

1 个答案:

答案 0 :(得分:1)

这看起来像个错误。你能在这里提出来吗?然后我们来看看。 https://github.com/Sable/soot/issues

无论如何,这是讨论此类问题的更好地方。

干杯, 埃里克