靜態代碼掃描價值
(1)研發過程,發現BUG越晚,修復的成本越大;
(2)缺陷引入的大部分是在編碼階段,但發現的更多是在單元測試、集成測試、功能測試階段;
(3)統計證明,在整個軟件開發生命周期中,30% 至 70% 的代碼邏輯設計和編碼缺陷是可以通過靜態代碼分析來發現和修復的。
目標:希望在編碼階段發現更多問題。(靜態代碼掃描、code review)
靜態代碼分析理論基礎和主要技術
靜態代碼分析原理分為兩種:分析源代碼編譯后的中間文件(如Java的字節碼);分析源文件。主要分析技術如下:
-
缺陷模式匹配
- 事先從代碼分析經驗中收集足夠多的共性缺陷模式,將待分析代碼與已有的共性缺陷模式進行匹配,從而完成軟件安全分析。優點:簡單方便;缺點:需要內置足夠多的缺陷模式,容易產生誤報。
-
類型推斷/類型推斷
- 類型推斷技術是指通過對代碼中運算對象類型進行推理,從而保證代碼中每條語句都針對正確的類型執行。
-
模型檢查
- 建立於有限狀態自動機的概念基礎上。將每條語句產生的影響抽象為有限狀態自動機的一個狀態,再通過分析有限狀態機達到分析代碼目的。
- 校驗程序並發等時序特性。
-
數據流分析
- 從程序代碼中收集程序語義信息,抽象成控制流圖,可以通過控制流圖,不必真實的運行程序,可以分析發現程序運行時的行為。
靜態代碼掃描工具/引擎對比
序號 | 引擎 | 分析對象 | 備注 |
---|---|---|---|
1 | Findbugs | 字節碼 | 缺陷模式匹配、數據流分析。通過字節碼分析代碼存在缺陷、支持數據流分析,能查找出空指針崩潰等問題。 |
2 | CheckStyle | Java源文件 | 缺陷模式匹配。掃描代碼格式規范、代碼風格的工具。 |
3 | Godeyes | ~ | 百度出品,主要針對Android代碼。 |
4 | Lint | Java源代碼 | Android官方提供的代碼分析工具,可以掃描出API兼容性問題、布局性能等針對Android代碼的潛在缺陷。 |
5 | PMD | Java源代碼 | 缺陷模式匹配、數據流分析。檢測代碼潛在錯誤。 |