Meta (原 FaceBook)一種新的靜態分析器,它可以在 Android 的 Java 程式碼中捕獲死鎖,而無需執行程式碼。該死鎖檢測器是開源的 的一部分。
據工程師 Nikos Gorogiannis 介紹,新的死鎖檢測器能夠分析具有數億行程式碼的程式碼庫的修訂,目前已經在 Meta 的持續整合系統中部署,它會掃描對 Android 應用程式系列的每個提交。在過去兩年中,Meta 開發人員針對它的死鎖報告採取了 200 多項修復措施,修復率約為 54%。
該檢測器如何運作?
該分析器使用抽象解釋技術來設計。對於每個方法,分析器都會計算方法在獲取和釋放鎖方面的行為摘要,以及該方法是在主執行緒還是在後臺執行緒上執行。然後使用一個關鍵對 (A,B) 記錄了以下事實:該方法試圖獲取鎖 B,而此時,它已經精確地持有集合 A 中的鎖。以上資料通過所有方法的計算得出,足以讓判斷兩個並行方法之間是否可能出現死鎖問題。
為了快速高效,該工具還避免分析應用程式中的所有原始檔。相反,它首先處理已修改檔案的所有方法。然後基於該資料應用啟發式方法,來定位修改檔案之外的方法,這些方法可能與修改版本中的一種方法發生死鎖。
死鎖通常是不可恢復的錯誤,也是非常難以診斷的錯誤,因為執行緒排程本質上是不確定的。因此,死鎖的測試可能需要執行數千或數百萬次才能顯示問題,那麼無需執行甚至構建程式碼即可靜態地檢測死鎖就非常有價值。
Nikos Gorogiannis 稱其團隊的方法已實現了死鎖分析這一目標,同時也使其具有足夠的可延伸性,可以在大型程式碼庫上部署分析器。
相關連結:
- 論文:
- 公告部落格: