Soot: soot.jimple.JimpleBody нельзя преобразовать в soot.dava.DavaBody - PullRequest
0 голосов
/ 20 декабря 2018

Я запустил следующий код, чтобы получить обработчик исключений в файле .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 type, а не JimpleBody , так почему же происходит эта ошибка?

Ответы [ 2 ]

0 голосов
/ 04 января 2019

По документации , public Body retrieveActiveBody():

Возвращает активное тело, если оно есть, иначе создает активное тело и возвращает его.

Давайте посмотрим на класс Body:

public abstract class Body
extends AbstractHost
implements Serializable

Так что это класс Abstract, и, за вашим исключением, он возвращает JimpleBody, подкласс Body.

Если Rabbit равен Animal, а Wolf также Animal, Rabbit не является 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 {

}
0 голосов
/ 04 января 2019

Тело является заявленным типом.В вашей конфигурации Soot он на самом деле возвращает JimpleBody.

...