堆疊安全分析¶
簡介¶
堆疊安全分析旨在判斷堆疊分配的變數是否可被視為免於記憶體存取錯誤的「安全」變數。
此分析的主要目的是供消毒器使用,以避免對「安全」變數進行不必要的檢測。SafeStack 將會是第一個使用者。
「安全」變數可以定義為超出作用域(例如,返回後使用)或超出邊界存取的變數。未來可以擴展以追蹤其他變數屬性。例如,我們計劃擴展實作,加入檢查以確保變數在每次讀取之前始終被初始化,以最佳化未初始化記憶體使用檢查。
運作方式¶
此分析分為兩個階段實作
程序內或「本地」階段在函數內部執行深度優先搜尋,以收集每個 alloca 的所有使用情況,包括載入/儲存以及作為函數參數的使用。在此階段之後,我們知道 alloca 的哪些部分被函數本身使用,但我們不知道將其作為參數傳遞給另一個函數後會發生什麼。
程序間或「全域」階段解決了 allocas 在作為函數參數傳遞後會發生什麼。此階段在單一模組內的函數呼叫上執行深度優先搜尋,並透過函數呼叫傳播 allocas 的使用情況。
當與 ThinLTO 一起使用時,全域階段會對模組摘要索引執行整個程式分析。
測試¶
此分析由 lit 測試涵蓋。
我們預期使用者可以容忍將變數錯誤分類為「不安全」,即使實際上它是「安全」的。這可能會導致效率低下的程式碼。但是,我們不能接受錯誤的「安全」分類,這可能會導致消毒器錯過檢測程式碼中的實際錯誤。為了避免這種情況,我們需要額外的驗證工具。
AddressSanitizer 可能有助於此驗證。我們可以像往常一樣檢測所有變數,但另外將堆疊安全資訊儲存在 ASanStackVariableDescription
中。然後,如果 AddressSanitizer 在「安全」變數上檢測到錯誤,我們可以產生額外的報告,讓使用者知道可能是堆疊安全分析失敗,我們應該檢查編譯器中的錯誤。