文章目錄
- 1 前言
- 2 什么是靜態分析
- 3 靜態分析方法
- 4 靜態分析內容
- 4.1 記憶體相關
- 4.2 邏輯類
- 4.3 編程風格與其他
- 5 常用靜態分析工具
- 6 參考文章
1 前言
??對于大型C/C++專案,一般是以團隊分模塊開發的方式,代碼量數十萬或者更多,由于代碼量的激增以及開發人員眾多,代碼出現bug的概率也隨之增加,——這是一個數學上概率論的問題,而不是程式員的編碼技術問題,其中一部分問題是非執行程序引起的靜態問題,如記憶體泄露、記憶體越界、野指標、邏輯模糊、死鎖等等,在發布代碼前可以借助一些檢測工具進行代碼分析,以排除靜態bug,除了檢查代碼靜態bug外,還可以判斷代碼復雜度、代碼質量、代碼執行效率等等,作為提高代碼質量的依據,
2 什么是靜態分析
?? 程式靜態分析(Program static analysis)是指在不執行代碼情況下, 通過詞法分析、語法分析、語意分析、控制流、資料流分析等技術對源代碼進行掃描,驗證代碼是否滿足規范性、安全性、可靠性、可維護性等指標的一種代碼分析技術, 通過對代碼進行審查分析,檢查代碼的功能、性能,提升代碼質量,靜態分析有兩種方式,分別是人工審查和軟體工具分析,
-
人工審查,依賴于人,適合于小型專案或者代碼量不大的場景;效率低、易遺漏
-
軟體工具分析,理想的方式, 準確率、可靠性、效率都遠高于人工審查
3 靜態分析方法
-
詞法分析,依次對代碼的字符流進行掃描,通過正則運算式方法將原始碼轉換為等價符號,并生成符號串列,
-
語法分析,該方法主要分析源代碼結構的正確性,將背景關系無關聯語法的符號整理成語法樹,
-
抽象語法樹分析,將源代碼組織生成樹形結構,關聯代碼以樹的節點表示,
-
語意分析,主要審查結構上正確的源代碼,分析代碼背景關系相關聯的性質,
-
控制流分析,該方法反映函式的嵌套關系,可以生成函式呼叫關系圖;通過分析源代碼,生成有向控制流圖,節點表示基本代碼塊,節點間的有向邊表示流控路徑,反向邊表示可能存在的回圈,
-
資料流分析,對“控制流分析”生成的控制流圖進行遍歷分析,記錄變數初始化點和參考點,并保存為切片相關的資料資訊,生成資料流圖,
-
污點分析,對“資料流分析”生成的資料流圖反推斷出源代碼中可能受“攻擊”的變數,識別代碼中可能存在的缺陷,
-
無效代碼分析,“控制流分析”生成的控制流圖中,無邊向的孤立節點即為無效代碼,通過該方法,可以檢測代碼邏輯問題,
4 靜態分析內容
??大多數情況下,靜態分析的物件都是程式源代碼,少數情況會使用編譯后的目標代碼(可執行檔案),靜態分析的內容,根據具體分析的物件,大致可以歸為三類:
【1】致命類(記憶體相關)
【2】邏輯類
【3】編碼規范與其他類
4.1 記憶體相關
??由于C/C++支持指標,通常有程式員來動態管理記憶體,這就可能導致記憶體泄露問題的產生,典型記憶體相關問題如下:
- 訪問沒有申請記憶體的空指標(空指標)
- 訪問已釋放記憶體的指標(野指標)
- 記憶體越界訪問
- 記憶體泄露,申請了記憶體沒有釋放
- 重復釋放記憶體
- 檔案描述符泄漏(未釋放)
- 格式化字串不安全(記憶體越界)
??關于記憶體問題的檢查,也常常使用Valgrind工具檢查,可參考文章如何使用Valgrind檢測記憶體泄漏,
4.2 邏輯類
- 邏輯錯誤,重復代碼分支、缺少分支陳述句(如
switch缺少break)、變數比較型別不一致、常true或false - 運算錯誤,除0運算、無符號數小于0、bool型別自加
- 可疑檢查,死回圈、死鎖、if陳述句“=”問題、回傳區域變數、變數溢位
4.3 編程風格與其他
- 編程風格,命名、規范性、可讀性、可移植和復用性
- 執行問題,函式未使用、變數未使用、代碼不可到達(提前
return) - 隱患問題,語法問題、邏輯模糊問題、型別強制轉換、編譯警告、
volatile問題 - 效率問題,時間復雜度、空間復雜度、邏輯回圈、
- 標準行業規范,如MISRA C
5 常用靜態分析工具
| 工具 | 支持語言 | 支持平臺 | 權 授 | 說明 |
|---|---|---|---|---|
| AdLint | C | Linux、Windows、Mac OS | 開源 | 代碼質量評估可視化,支持多種軟體品質測量 |
| Coverity Prevent | C/C++、C#、JAVA | Linux、Windows、Mac OS | 付費 | 提供多種輔助工具,專長于最準確的找到最嚴重和最難檢測的缺陷 |
| Flawfinder | C/C++ | Linux、Windows | 開源 | 使用用Python撰寫的c/c++程式安全審查工具;詞法掃描和分析,內嵌了一些漏洞資料庫,如緩沖區溢位、格式化串漏洞等,掃描快,按照代碼中漏洞的風險等級對漏洞進行劃分,可以快速找到存在的問題 |
| Klocwork | C/C++、C#、JAVA | Linux、Windows | 付費 | 國內使用較廣泛的分析工具 |
| Rats | C/C++、Python、Perl、 PHP | Linux、Windows | 開源 | 掃描規則比較粗糙 |
| PC-Lint | C/C++ | Windows | 付費 | 一個由Gimpel Software公司提供的支持C/C++的商用靜態分析器 |
| Cppcheck | C/C++ | Linux、Windows | 開源 | 支持圖形界面和命令列 |
| Splint | C | Linux | 開源 | 靜態檢測針對C語言的安全工具和漏洞檢測;Splint支持多種常規檢查 |
| cqual | C/C++ | Linux | 開源 | 輕量級的靜態分析器,可在類Linux系統下運行 |
| BLAST | C | Linux | 開源 | 采用反例驅動的自動抽象精細化方法,構建了一個抽象模型,并對模型的安全性能進行了驗證的C語言分析器 |
| Frama-C | C | Linux、Windows、Mac OS | 開源 | 針對C語言的靜態分析器 |
| ITS4 | C/C++ | Linux、Windows | 開源 | Cigital公司開發的自動化原始碼審查工具;但它不能理解程式背景關系意思,存在很大的誤報 |
| CoBot | C/C++ | Linux、Windows | 開源 | 北京大學開發,中國首家通過CWE認證的軟體安全檢測工具 |
| TscanCode | C/C++、C#、Lua | Linux、Windows、Mac OS | 開源 | 騰訊開發的靜態分析工具 |
推薦使用:
CoBot、TscanCode、Cppcheck、Flawfinder
??個人使用首選開源工具;付費的功能很強大,但費用都比較昂貴,適合于公司使用,
??實質上,不論是人工審查還軟體分析,都可能存在一定的誤報率,甚至漏報,因此,提高代碼質量的根本途徑在于編碼程序,形成良好編碼習慣,是保證代碼質量的最可靠方式,
6 參考文章
【1】【代碼質量】C++代碼質量掃描主流工具深度比較
【2】國內外主流靜態分析類工具匯總
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/78709.html
標籤:其他
