2

使用 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 框架设计的还是一个错误?
  2. 如果是有意的,如何防止 Soot 向场景中添加“虚拟”SootClass?
  3. 是否有另一种方法来测试某个类是否在 Soot 的类路径中而不将其添加到 Soot 的场景中?

更新:
一个丑陋但可行的解决方法是:

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...
}
4

1 回答 1

2

这看起来像一个错误。请问可以在这里存档吗?然后我们来看看。 https://github.com/Sable/soot/issues

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

干杯,埃里克

于 2013-06-13T20:51:12.603 回答