演講嘉賓 |蔡源稻
回顧整理 | 廖 濤
排版校對 | 宋夕明

嘉賓介紹
研究分論壇
蔡源稻,華為2012實驗室技術專家。
正文內容
靜態分析(Static Analysis)是軟件開發中不可或缺的一部分,它可以幫助開發人員提高代碼質量、減少缺陷和安全風險。OpenHarmony的編譯環境復雜,代碼量巨大,且由多種編程語言混合編程,在靜態分析上存在不小挑戰。如何提升OpenHarmony靜態分析的準確性和效率?華為2012實驗室技術專家蔡源稻在第三屆OpenHarmony技術大會上進行了精彩分享。

在軟件開發的生命周期中,代碼的質量和安全性至關重要。隨著軟件系統的復雜性不斷增加,如何在有限的時間和資源內,確保軟件的功能正確性、性能優化以及安全性?這就涉及兩種重要的分析技術:靜態分析和動態分析。
動態分析指在程序運行時對其行為進行監控和分析,能夠捕捉到實際運行中的性能瓶頸、內存泄漏和競態條件等問題。相對而言,靜態分析則在不執行程序的情況下利用軟件結構窮舉軟件所有可能的運行時行為并將這些行為以數據結構形式記錄,從而幫助開發者在早期階段發現潛在的錯誤、安全漏洞和代碼質量問題。
對于OpenHarmony而言,由于其編譯環境復雜,代碼量巨大,且由多種編程語言混合編程,靜態分析存在以下挑戰:
覆蓋率不高:靜態分析理論上可以完整覆蓋程序運行行為,但工程代價太高/分析效率太低,導致實際上覆蓋率不高;同時,動態分析也無法完整覆蓋程序。

無法適配復雜編譯:靜態分析工具需要干預編譯過程來獲得待分析代碼(IR),OpenHarmony的編譯環境復雜 (涉及多個編譯器,一個編譯器不同版本),很難滿足此要求。

分析代價高:精確的靜態分析,如控制流敏感、函數上下文敏感、路徑敏感分析需要較高的分析代價(時間、內存)。對于OpenHarmony海量的代碼而言,現有靜態分析方法無法在物理資源和時間限制下完成代碼分析。

庫函數建模困難:由于庫函數(e.g., STL C++)需要手動建模才能適配靜態分析,但已有靜態分析遇到未知庫函數只能做保守假設或直接丟棄結果。

針對上述問題,作者本人提出了以下解決方案,并介紹了當前在研產品“費馬分析器(Fermat Analyzer)”的部分創新技術點:
非侵入編譯的IR構建:非侵入編譯的IR構建(Non-intrusive Compilation for IR Construction)是一種在編譯過程中構建中間表示(Intermediate Representation, IR)的技術,其核心特點是在不修改或侵入源代碼的情況下生成IR。在正向編譯時,無需修改編譯環境,套用工具在編譯腳本即可完成IR構建;而反編譯時,翻譯可以處理第三方庫,二進制形式等產品模塊。

基于PDG的稀疏值流分析:Program Dependence Graph(PDG)是一種用于表示程序中語句或指令之間依賴關系的圖形化數據結構。通過簡潔編碼數據依賴和控制依賴,能夠清晰地表示程序的執行邏輯,并優化分析過程。具體做法有:(1)拋棄全局窮盡式的指針分析,通過高精度局部指針分析,發現并記錄因為指針操作產生的函數內的內存讀寫數據依賴;(2)跨函數在按需分析時在調用函數中將跨函數數據依賴對齊;(3)指針同化為普通數據流,賦能按需計算,可理解為 IFDS 加入路徑條件和指針信息。

持久化設計,分析復用:通過復用第三方庫分析結果,能夠加速分析,減少內存占用;通過程序拆分,可在單機上完成大規模代碼分析。

大模型使能與輔助:當前,AI技術的快速發展,使大模型與代碼分析相結合是一個重要趨勢。例如,將大模型使能規約推斷:函數行為推斷(內存創建/釋放,中斷函數等),API別名信息推斷;或通過大模型輔助誤報診斷:基于缺陷程序切片以及缺陷信息進行誤報診斷。

接下來,對于復雜代碼的靜態分析的實際問題,看看費馬分析器是如何解決的:
一、并發內存安全錯誤檢查。現有的關于并發程序分析的精確方法往往效率較低。Canary方法首次將并發錯誤檢測轉化為Source-Sink值流 (Value Flow)的檢查,通過監視內存對象在數據依賴關系中沿指針之間的流動,觀察到Source最終沿Sink流路徑到達匯。因此,考慮到只有對線程共享內存位置的內存訪問才重要,許多線程執行交錯對于檢測的并發錯誤來說是無關緊要的,費馬分析器采取了減少指數級爆炸的線程交錯分析的方法。

二、準確高效的死鎖檢查。在執行上下文敏感的死鎖檢測時,容易出現函數上下文爆炸的問題 (Calling Context Explosion)。考慮到許多函數上下文對死鎖檢測來說是無關緊要的,因此,費馬分析器采取了Peahen方法(第一種用于緩解低效問題的函數上下文縮減技術 (Context Reduction)),通過對兩個協同階段進行昂貴的函數上下文敏感計算的分解,進行上下文無關的鎖圖構建以發現死鎖相關的函數。

三、準確高效的函數調用圖:雞尾酒療法。對于解析函數指針的值,以及構建C代碼的函數調用圖,傳統單一模式 (e.g., SVF, LLVM)——即用一種精度來分析所有的間接調用,往往要么不精確要么不高效。費馬分析器采用多種精度來分析所有的間接調用,以自動準確的方式決定一個間接調用需要哪種準確的分析,并采用合適的精度來回避計算資源浪費。

未來,隨著AI大模型的迅速發展,代碼規模和分布式架構的復雜性都不斷提高,靜態分析作為系統可信和軟件質量的重要保障,也正從傳統的模式匹配向智能化、場景化方向演進。隨著技術的不斷進步,靜態分析將在軟件開發的各個環節發揮更加關鍵的作用,為構建高質量、高性能、高安全性的軟件系統提供堅實的支持。
-
編程
+關注
關注
90文章
3716瀏覽量
97178 -
代碼
+關注
關注
30文章
4967瀏覽量
73954 -
混合編程
+關注
關注
0文章
27瀏覽量
8461 -
靜態分析
+關注
關注
1文章
45瀏覽量
4206 -
OpenHarmony
+關注
關注
33文章
3952瀏覽量
21095
發布評論請先 登錄
帝奧微第三屆經銷商大會圓滿舉行
中興通訊第三屆學習發展大會圓滿收官
國際星閃聯盟亮相第三屆電子紙產業創新大會
奇異摩爾出席第三屆芯粒開發者大會AI芯片與系統分論壇
行芯科技亮相第三屆芯粒開發者大會
第三屆大會回顧第6期 | HarmonyOS NEXT原生智能,助力應用低成本生而智能
第三屆大會回顧第7期 | 面向OpenHarmony大規模代碼的路徑敏感的稀疏值流分析
評論