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