Adrninistrator / java-callgraph2

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

关于实现关系的 method_call 缺失和错误 #51

Open 0o0b opened 3 months ago

0o0b commented 3 months ago

使用过程中发现,对于继承关系,如:

public class A {
    public void exec() {}
}

public class B extends A {}

jacg_method_call中记录了子类方法对父类方法的调用关系:

B.exec 调用 A.exec

但是对于实现关系,如:

public interface A {
    default void exec() {}
}

public class B implements A {}

并没有记录子类方法对接口方法的调用关系。

是否可以添加这类调用关系?


特别地,对于多级实现关系,例如:

public interface A {
    default void exec() {}

    void test();
}

public interface B extends A {}

public class C implements B {
    public void test() {}
}

如果可以增加调用关系的话,首先必定要记录的是:

B.exec 调用 A.exec

至于C,建议记录:

C.exec 调用 B.exec

而不是:

C.exec 调用 A.exec

另外,目前的实现会生成两条调用关系:

B.test 调用 A.test(错误,应当是 A.test 调用 B.test)
B.test 调用 C.test

对于abstract class多级继承是否存在类似的问题,我尚未进行测试。

0o0b commented 3 months ago

版本:

Adrninistrator commented 3 months ago

现在对于接口中的default方法没有专门做处理,后面可以加一下

0o0b commented 3 months ago

另外,目前的实现会生成两条调用关系:

B.test 调用 A.test(错误,应当是 A.test 调用 B.test)
B.test 调用 C.test

对于abstract class多级继承是否存在类似的问题,我尚未进行测试。

经测试,abstract class多级继承中无类似问题。

Adrninistrator commented 2 months ago

java-callgraph2 2.0.3版本支持了对接口中的default方法在涉及实现时的处理 java-all-call-graph对应的版本等有空了提交

Adrninistrator commented 2 months ago

java-all-call-graph版本:2.0.1