Soot:soot.jimple.JimpleBody 无法转换为 soot.dava.DavaBody

Soot: soot.jimple.JimpleBody cannot be cast to soot.dava.DavaBody

我运行以下代码获取.class文件中的异常处理程序:

public void getException(SootMethod method){
    DavaBody db = (DavaBody) method.retrieveActiveBody();
    IterableSet excepFacts = db.get_ExceptionFacts();
    Iterator<ExceptionNode> it = excepFacts.iterator();
    while(it.hasNext()){
        ExceptionNode en = it.next();
        ...
    }
}

我在 运行 上面的代码后出现错误:

Exception in thread "main" java.lang.ClassCastException: 
soot.jimple.JimpleBody cannot be cast to soot.dava.DavaBody

方法method.retrieveActiveBody() returns Body类型,不是JimpleBody,为什么会出现这个错误呢?

正文是声明的类型。在您的 Soot 配置中,它实际上 returns 一个 JimpleBody。

documentationpublic Body retrieveActiveBody()是:

Returns the active body if present, else constructs an active body and returns that.

让我们看看 Body class:

public abstract class Body
extends AbstractHost
implements Serializable

所以它是 Abstract class,除此之外,它是 returns JimpleBodyBody 的子class。

如果RabbitAnimal,而Wolf也是AnimalRabbit不是Wolf

您可以这样编辑代码:

if (method.retrieveActiveBody() instanceof JimpleBody) {

} else if (method.retrieveActiveBody() instanceof DavaBody) {

} else if (method.retrieveActiveBody() instanceof BafBody) {

} else if (method.retrieveActiveBody() instanceof StmtBody) {

} else {

}