2017-01-22 90 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)」