2017-01-22 22 views
0

这里是一个与使用CHA构造Java字节码的调用图的算法有关的问题。OPAL-关于使用CHA算法在抽象类中定义方法的调用

由于抽象类中的方法没有具体的方法实现,因此向这些方法添加调用边缘可能有点误导。例如 以junit-4.12.jarrunFailed已被定义在junit.runner.BaseTestRunner这是一个抽象类。此外,也有方法getTest调用runFailedjunit.runner.BaseTestRunner

同时也定义在“假设层次的CHA调用图构造算法”(贾森&阿塔纳斯),据说

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

至于即时考虑,没有添加从junit.runner.BaseTestRunner getTest呼叫边缘(Calledge1)至junit.runner.BaseTestRunner runFailed,更合理从junit.runner.BaseTestRunner getTest添加一个呼叫边缘(Calledge2)至junit/textui/TestRunner runFailed作为TestRunner的延伸BaseTestRunner。

在运行测试代码以获取CallGraph.calledByStatistics()的结果后,只找到Calledge1。 Calledge2缺失。

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

问候,

回答

1

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

在CallGraph.calledByStatistics()

的结合是调用点(PC)之间进行caller.method 例如:在...之间“INVOKEVIRTUAL(junit.runner.BaseTestRunner {无效runFailed(java.lang.String中)} )”和 的junit /浇道/ BaseTestRunner.public junit.framework.Test getTest(java.lang.String中)

在CallGraph.callsStatistics()

的结合是subtype.method到caller.method 之间例如: 两者之间“junit/textui/TestRunner.protected void runFailed(java.lang.String)”and“junit/runner/BaseTestRunner.public junit.framework.Test getTest(java.lang.String)”

相关问题