如何防止loadClassAndSupport创建一个空的煤灰类



使用烟尘框架(v.2.5.0),我试图加载一个特定的类:

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

在调用Scene#loadClassAndSupport之前,类example.MyClass不在场景中-这是正确的。
类也不存在于烟灰类路径上,上面的语句抛出一个RuntimeException,告诉类无法找到。这也是正确的行为。

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

  1. 这个行为是由烟尘框架设计的还是一个bug?
  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...
}

这看起来像是一个bug。你能把它归档到这里吗?然后我们来看一看。https://github.com/Sable/soot/issues

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

欢呼,Eric

相关内容

  • 没有找到相关文章

最新更新