OPAL-в отношении поиска вызовов методов, определенных в абстрактном классе с использованием алгоритма CHA
Вот вопрос, связанный с алгоритмом построения графа вызовов для байт-кода Java с использованием CHA.
Поскольку нет конкретной реализации метода для методов в абстрактных классах, добавление границы вызова к таким методам может быть немного обманчивым. принимать junit-4.12.jar
например. runFailed
был определен в junit.runner.BaseTestRunner
который является абстрактным классом. Кроме того, есть звонки runFailed
в методе getTest
который также определен в junit.runner.BaseTestRunner
В "Иерархии допущений для алгоритма построения графа вызовов CHA"(Jason&Atanas) сказано, что
"учитывая сайт вызова xm(), где объявленным типом x является C, возможный тип времени выполнения x должен быть неабстрактным подтипом C."
Насколько я считаю, без добавления края вызова (Calledge1) из junit.runner.BaseTestRunner getTest
в junit.runner.BaseTestRunner runFailed
, более разумно добавить край вызова (Calledge2) из junit.runner.BaseTestRunner getTest
в junit/textui/TestRunner runFailed
так как TestRunner расширяет BaseTestRunner.
Хотя после запуска тестового кода для получения результата CallGraph.calledByStatistics(), только Calledge1 был найден. Calledge2 отсутствует.
Кто-нибудь может сделать мне одолжение, чтобы подтвердить это? Заранее спасибо.
С Уважением,
Jiang
1 ответ
Я обнаружил, что OPAL предлагает два вида графа вызовов. Второй не добавит ребро "библиотека-вызов" в ребро вызова.
В CallGraph.calledByStatistics()
Связывание происходит между 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)"