出品|開源中國
文|羅奇奇
Meta (原 FaceBook)開發(fā)了一種新的靜態(tài)分析器,它可以在 Android 的 Java 代碼中捕獲死鎖,而無需運行代碼。該死鎖檢測器是開源的Infer 靜態(tài)分析框架的一部分。
據(jù)工程師 Nikos Gorogiannis 介紹,新的死鎖檢測器能夠分析具有數(shù)億行代碼的代碼庫的修訂,目前已經(jīng)在 Meta 的持續(xù)集成系統(tǒng)中部署,它會掃描對 Android 應用程序系列的每個提交。在過去兩年中,Meta 開發(fā)人員針對它的死鎖報告采取了 200 多項修復措施,修復率約為 54%。
該檢測器如何運作?
該分析器使用抽象解釋技術來設計。對于每個方法,分析器都會計算方法在獲取和釋放鎖方面的行為摘要,以及該方法是在主線程還是在后臺線程上運行。然后使用一個關鍵對 (A,B) 記錄了以下事實:該方法試圖獲取鎖 B,而此時,它已經(jīng)精確地持有集合 A 中的鎖。以上數(shù)據(jù)通過所有方法的計算得出,足以讓判斷兩個并發(fā)方法之間是否可能出現(xiàn)死鎖問題。
為了快速高效,該工具還避免分析應用程序中的所有源文件。相反,它首先處理已修改文件的所有方法。然后基于該數(shù)據(jù)應用啟發(fā)式方法,來定位修改文件之外的方法,這些方法可能與修改版本中的一種方法發(fā)生死鎖。
死鎖通常是不可恢復的錯誤,也是非常難以診斷的錯誤,因為線程調(diào)度本質(zhì)上是不確定的。因此,死鎖的測試可能需要運行數(shù)千或數(shù)百萬次才能顯示問題,那么無需運行甚至構建代碼即可靜態(tài)地檢測死鎖就非常有價值。
Nikos Gorogiannis 稱其團隊的方法已實現(xiàn)了死鎖分析這一目標,同時也使其具有足夠的可擴展性,可以在大型代碼庫上部署分析器。
關鍵詞: Meta Android Java 的靜態(tài)死鎖檢測器