Adrninistrator / java-callgraph2

Programs for producing static call graphs for Java programs.
Apache License 2.0
184 stars 66 forks source link

子类调用父类方法,后续路径缺失 #29

Closed john-70 closed 1 year ago

john-70 commented 1 year ago

版本1.0.11

public class AService extends BaseService{
    public String handle() {
        return baseHandle();
    }
}

public class BaseService {
    String baseHandle() {
        return getStr();
    }

    private String getStr() {
        return "123";
    }
}

BaseService:baseHandle()在method_call中记录的是AService:baseHandle()

2   org.testcase2.service.AService:handle() (VIR)org.testcase2.service.AService:baseHandle()    5   t   java.lang.String        1   1

BaseService:baseHandle()的后续路径会丢失

Adrninistrator commented 1 year ago

对应以上的代码,在编译后的字节码中,AService:handle()确实是调用了AService:baseHandle()方法

如果使用https://github.com/Adrninistrator/java-all-call-graph项目,使用生成向下的方法完整调用链的功能(参考TestRBCRunnerGenAllGraph4Caller类),可以识别到以上baseHandle()方法是调用的BaseService.baseHandle()方法,再关联到BaseService.getStr()方法

john-70 commented 1 year ago

例子中的baseHandle(), 访问修饰级别为defualt,此时会丢失。 JarEntryPreHandle2Parser的findClassExtendsInfo做了条件限制(abstract,public,protected)

// 遍历类的方法
        for (Method method : javaClass.getMethods()) {
            String methodName = method.getName();
            if (!methodName.startsWith("<") &&
                    !method.isStatic()
                    && (method.isAbstract() || method.isPublic() || method.isProtected())
            ) {
                // 记录当前类的方法信息
                methodAttributeMap.put(new MethodAndArgs(methodName, method.getArgumentTypes()), method.getAccessFlags());
            }
        }
Adrninistrator commented 1 year ago

这两天周末,我改一下这个问题

Adrninistrator commented 1 year ago

已解决,最新版本1.0.12

john-70 commented 1 year ago

已验证