2013-08-20 75 views
1

我試圖執行一個程序內分析,爲每個方法計算該方法可能拋出的異常集,包括通過throw語句顯式拋出的運行時異常。如何爲每種方法計算該方法可能拋出的異常集,包括運行時異常?

到目前爲止,我完全失去了如何開始與SOOT。任何人都可以給我第一個提示?

+1

只是要清楚,你要明確地列舉每一個可能的運行時類異常可能被拋出,其中包括調用的方法,其來源可能無法使用拋出'RuntimeException's? – chrylis

+0

我想列舉所有異常:既有選中也有未選中。更具體地說,我想枚舉實際上正在引發哪些異常,因爲方法可能會在其接口中聲明更通用的檢查異常。 關於源代碼,將會有兩種情況:可用的源案例,並且只有.class可用。 – EijiAdachi

+3

但是,您至少會擁有所有實際實現類的'.class'文件?你的系統不允許任何在運行時提供的'interface'實現,比如通過SPI? – chrylis

回答

1

你應該看看ThrowsAnalysis的實現。可以對分析進行參數化,以便對哪些語句可以拋出哪些異常做出不同的假設。該分析是程序內的,但是,必須對方法調用做出粗略的假設。如果您想要精確建模方法調用,那麼我建議使用Heros進行程序間分析。

乾杯, 埃裏克

-1
  1. 根據它們擴展或實現的內容,爲源文件和.class文件的主體索引類和接口。如果A擴展了擴展C實現了D,B應該出現在所有B,C和D的類集合中。
  2. 從每個方法,初始化器,靜態初始化器塊等開始,查找每個構造器或方法它可能會打電話。創建一組包含每個子類中相應方法的調用方法。如果您調用D的get(int)方法,則必須在A,B和C中包含相應的方法。可以使用步驟1中的索引找到它們。
  3. 從感興趣的方法(如主方法或方法)可能直接或間接調用的所有方法和構造函數的列表。實際上,「間接調用」是步驟2中關係構建的傳遞閉包。
  4. 檢查步驟3的結果中每個可能調用的方法或構造函數。對於每個throw語句,報告操作數的類型。

如果從中受益,證明成本合理,我將非常非常驚訝。

下面是問題區域的一個示例。如果使用方法HashMapget()方法,您可以使用Objectequals()hashCode()方法。每個課程直接或間接地延伸Object,因此任何equals()hashCode()方法中的任何throw語句的參數類型都在列表中。

+0

在第4步中,你的意思是拋出子句(foo拋出IOException)或拋出語句(拋出新的異常)? – EijiAdachi

+0

@EijiAdachi「扔語句」 - 我已經修改過。但是,請記住操作數不一定是新構造的對象 - 它可能是現有的異常,或者是通過某種方法調用獲得的異常。 –