OPAL-关于使用 CHA 算法查找摘要 Class 中定义的方法调用

OPAL-Regarding Finding Calledges of methods defined in Abstract Class using CHA algorithm

这是一个与使用 CHA 为 Java 字节码构造调用图的算法相关的问题。

由于抽象 classes 中的方法没有具体的方法实现,因此向此类方法添加调用边缘可能会产生误导。 以 junit-4.12.jar 为例。 runFailed 已在 junit.runner.BaseTestRunner 中定义,它是一个抽象 class。此外,方法 getTest 中有对 runFailed 的调用,该方法也在 junit.runner.BaseTestRunner

中定义

而在"Assumption Hierarchy for a CHA Call Graph Construction Algorithm"(Jason&Atanas)中,据说

"given a call site x.m(), where the declared type of x is C, the possible runtime type of x must be a non-abstract subtype of C."

据我考虑,不从junit.runner.BaseTestRunner getTestjunit.runner.BaseTestRunner runFailed添加一个call edge(Calledge1),从[=17添加一个call edge(Calledge2)更合理=] 到 junit/textui/TestRunner runFailed 因为 TestRunner 扩展了 BaseTestRunner.

而在运行 测试代码得到CallGraph.calledByStatistics() 的结果之后,只找到了Calledge1。缺少 Calledge2。

有没有人可以帮我确认一下? 提前谢谢你。

此致,

我发现 OPAL 提供了两种调用图视图。第二个不会将 "library-call" 边添加到调用边中。

在CallGraph.calledByStatistics()

绑定在调用站点 (PC) 与 caller.method 之间 例如:在“INVOKEVIRTUAL(junit.runner.BaseTestRunner{ void runFailed(java.lang.String) })”和 junit/runner/BaseTestRunner.public junit.framework.Test getTest(java.lang.String)

在CallGraph.callsStatistics()

绑定在 subtype.method 到 caller.method 之间 例如: 在“junit/textui/TestRunner.protected void runFailed(java.lang.String)”和“junit/runner/BaseTestRunner.public junit.framework.Test getTest(java.lang.String)”