0

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

由于抽象类中的方法没有具体的方法实现,因此向此类方法添加调用边缘可能会有点误导。举junit-4.12.jar个例子。runFailed其中已经定义了junit.runner.BaseTestRunner一个抽象类。此外,还有对runFailedin 方法的调用,该方法getTest也定义在junit.runner.BaseTestRunner

在“CHA 调用图构造算法的假设层次结构”(Jason&Atanas)中,据说

“给定一个调用站点 xm(),其中 x 的声明类型是 C,x 的可能运行时类型必须是 C 的非抽象子类型。”

据我考虑,如果不添加调用边缘(Calledge1) from junit.runner.BaseTestRunner getTestto ,添加调用边缘(Calledge2) from tojunit.runner.BaseTestRunner runFailed更合理,因为 TestRunner 扩展了 BaseTestRunner。junit.runner.BaseTestRunner getTestjunit/textui/TestRunner runFailed

而在运行测试代码得到 CallGraph.callByStatistics() 的结果后,只找到了 Calledge1。Calledge2 丢失。

有人可以帮我确认一下吗?先感谢您。

问候,

4

1 回答 1

1

我发现 OPAL 提供了两种调用图视图。第二个不会将“库调用”边缘添加到调用边缘。

在 CallGraph.callByStatistics()

绑定在 Callsite (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)”</p>

于 2017-01-30T02:27:20.257 回答