什麼是完全的靜態分析?

創提科技
2022/08/30

分享到

在開發安全、可靠和相容的軟體時,完全的靜態分析是一個大有裨益的實踐方法。在這裡,我們將討論:從靜態分析的角度來看,什麼使完全的靜態分析與眾不同?為什麼完全的靜態分析很重要?完全的靜態程式碼分析是如何運行的?


本文將包含如下幾個部分:
 
     • 什麼是完全的靜態分析?
 
     • 完全的靜態分析是如何運行的?
 
     • 為什麼完全的靜態分析很重要?
 
     • 如何使用Helix QAC進行完全的靜態分析?


什麼是完全的靜態分析?
 
完全的靜態分析,或稱完全的分析,是指分析結果的完整性或“全面性”。對於一款靜態分析工具來說,如果聲稱提供了完全的分析結果,則意味著:如果一個特定的錯誤、缺陷或漏洞存在於一款軟體中,那麼該工具將會發出報告。
 
如果存在或不存在是有爭議的,那麼將提供某種形式的警告*,這樣就不會“漏掉”任何問題。(*注:這些在Helix QAC中被歸類為可能存在的問題,如果不需要完全的分析,可以禁用。)
 
完全的靜態分析不同於其他形式的靜態分析,其他形式的靜態分析結果可能是基於在一定的時間或資源範圍內可能發生的狀況。
 
考慮到對程式運行時行為建模需要某些近似值(例如,缺乏對程式輸入或作業系統狀態的瞭解),那麼完全的靜態分析則需要充分甚至冗餘地覆蓋到這些近似條件(over-approximation)。
 
近似冗餘(over-approximation)確保沒有漏報(對於某種特定的漏洞),近似不足(under-approximation)通常優先考慮不存在誤報。
 

什么是完全的静态分析-1.jpg


其他形式的靜態分析沒有這麼嚴格,可能同時包含近似冗餘和近似不足的情況。
 
來自完全和不完全的靜態分析工具的結果都有可能為程式的特定部分提供良好的健康狀況報告,但是完全的靜態分析引擎能提供額外的保證,即在得出這個結論時,所有的可能性和所有的路徑都是經過驗證的。


完全的靜態分析是如何運行的?
 
當提到完全的靜態分析時,我們通常考慮形式更複雜的程式間和程式內的控制流和資料流程分析,就像在當今最先進的靜態分析工具中發現的那樣。
 
控制流和資料流程靜態分析,不是更簡單的程式碼語法和語義分析,而是通常與檢測更複雜的問題有關,例如:
 
    • 空指針解除引用
 
    • 陣列或緩衝區下溢與溢出
 
    • 使用未初始化的物件
 
    • 記憶體分配和解除配置異常
 
    • 數值溢出、下溢和環繞
 
    • 除零
 
    • 死程式碼
 
    • 資料爭用、鎖死和其他併發衝突
 
控制流和資料流程分析是一項計算密集型任務,因為必須考慮系統的所有可能輸入和通過系統的所有可能控制流路徑。事實上,用於控制流和資料流程分析的暴力詳盡演算法會導致分析時間呈指數級別,因此很少適用。然而,符號執行(Symbolic Execution)和抽象解釋(Abstract Interpretation)演算法是更優雅的選擇。
 
根據 Roberto Amadini, Graeme Gange, Peter Schachte, Harald Søndergaard以及Peter J. Stuckey撰寫的Abstract Interpretation, Symbolic Execution and Constraints所述,“抽象解釋是一個靜態分析框架,用於對程式所有可能的運行時狀態進行全面的冗餘近似(over-approximation)。”
 
而“符號執行是一個可達性分析框架,試圖探索一個程式的所有可能的執行路徑。”抽象解釋和符號執行在執行期間都以不變數或路徑條件的形式維護約束條件,它們決定在不同的資料來源條件下哪些路徑可能被執行,哪些值可能會出現。
 
然而,至關重要的是,抽象解釋是全面的,但符號執行卻不是。


為什麼完全的靜態分析很重要?
 
全面性是安全關鍵型軟體系統中的一個重要因素,特別是因為它能保證軟體不包含任何要檢查的編碼缺陷。也就是說,如果一款軟體中沒有錯誤,完全的靜態分析可以用來證明錯誤的不存在。
 
因此,在適用於汽車系統的ISO 26262功能安全(FuSa)標準中,抽象解釋分析被明確引用為軟體單元驗證的方法(表7,方法1i)。


如何使用Helix QAC進行完全的靜態分析?
 
由於能夠提供深入和高度準確的分析結果,Helix QAC作為一款值得信賴的靜態程式碼分析工具已經超過30年。Helix QAC能夠進行完全的靜態分析,一直是需要滿足嚴苛合規要求的監管嚴格和安全關鍵行業的首選工具。
 
然而,為了在您的Helix QAC專案中進行完全的靜態分析,還需要做一些設置:


什么是完全的静态分析-2.jpg

 

資料流程深度(Dataflow Depth)需要設置為最高值(5),這將添加幾個-prodoptions,如上面的截圖所示。(請參閱QAC或QAC++元件手冊中的“分析超時(Analysis Timeout)”部分的討論:為什麼這些“超時(timeout)”設置對於完全的靜態分析而言是強制的。)
 
此外,即使不需要進行完全的靜態分析,也可以啟用‘df::inter=5’和‘Inter TU Analysis’, 以花費額外的計算成本來減少需要報告的可能存在的問題數量。這些設置的目的是能夠支援程式間和程式內分析。


為什麼選擇Helix QAC進行完全的靜態分析
 
如果您想親自體驗Helix QAC完全的靜態分析對程式碼品質和全面性的影響,立刻註冊申請免費試用吧。