0

我运行以下代码来获取 .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()返回Body类型,而不是JimpleBody,那么为什么会发生此错误?

4

2 回答 2

1

Body 是声明的类型。在您的 Soot 配置中,它实际上返回了一个 JimpleBody。

于 2019-01-04T10:17:27.077 回答
1

根据文档public Body retrieveActiveBody()是:

如果存在则返回活动体,否则构造一个活动体并返回它。

让我们看看这个Body类:

public abstract class Body
extends AbstractHost
implements Serializable

所以它是Abstract类,并且由于您的例外,它返回JimpleBody, 的子类Body

如果RabbitAnimalWolf也是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 {

}
于 2019-01-04T13:25:57.737 回答