BEAM
IBM Checking Tool for Bugs Errors and Mistakes 是由 IBM 開發的靜態代碼分析工具,它可用於分析並查找 C、C++ 和 Java 代碼中的一些不容易發現的潛在錯誤,從而提高代碼質量。由於這個工具目前多用於 Linux/AIX 平台上對 C 和 C++ 語言的檢查分析,而使用其在最常用的 Windows 平台上對 Java 進行靜態分析的人不多,因此經驗不足,文檔匱乏。本文的主要目的是介紹如何在 Windows 上成功運行 BEAM,檢查 Java 代碼中的潛在錯誤,從而提高代碼的安全性和穩定性。 什麼是 BEAM?
IBM Checking Tool for Bugs Errors and Mistakes(本文後面將採用其文字縮寫 BEAM)是 IBM 開發的一個靜態分析工具,可以用於分析並查找出 C, C++ 和 Java 代碼中的一些不容易發現的潛在錯誤,從而達到提高代碼質量的目的。同動態分析工具和其它靜態分析工具相比,它擁有一些可貴的特性。
同動態分析工具的比較
首先,BEAM 可以直接對代碼進行分析,不需要運行代碼,也不需要對代碼編譯連結,所以相對容易。比如,運行它不需要為代碼編寫任何測試用例,而動態分析僅在單元測試時就需要大量測試用例,而且這些測試用例只能測試單個代碼片段,重用性很低,基本上每個類都需要不同的測試用例,因此只有編寫足夠多的單元測試用例才能測試大型的軟體產品,耗時且代價高昂。
其次,這個工具可以查找出單元測試和專業代碼審查所可能錯過的代碼缺陷和安全弱點,比如記憶體泄漏,非法的資料庫訪問和非法記憶體訪問等等,據統計,BEAM 可以在平均每 1000 行已經經過測試的代碼中找出一個錯誤。
再次,在開發早期就可以運行其對代碼進行檢查,從而在產品開發早期發現缺陷,有助於降低開發成本。同時,它還有助於開發人員在產品開發早期發現自己編碼風格的缺點,及早做出改進,防止工程後期重複發生相同類型的錯誤。
比較
同其它靜態分析工具一樣,BEAM 也是對代碼進行語法掃描,通過算法對代碼進行檢查分析,並和一些 bug 模式進行比較,最終標明問題區域,輸出分析結果。但是相對於其他靜態分析工具,它有一些獨到的優點。
首先,它模仿 javac 的使用,語法和 javac 相似,支持許多 javac 的常用命令參數,而且具有相同的語義,比如-classpath,-source,-d 等等;不僅如此,它還模仿 javac 接受相同的源檔案,只不過不是編譯,而是分析檢查這些源檔案。這樣習慣於 javac 的開發人員就可以很輕鬆的學會使用。
其次,許多靜態分析工具報錯的準確性較低,很多被這些工具標記為錯誤的代碼事實上是正確的,這樣會增加程式設計師工作量,並有可能掩蓋真正的錯誤。而 BEAM 使用了額外的定理證明(theorem proving)技術來判斷一個潛在的錯誤是否是真正的錯誤,從而減輕了程式設計師判斷錯誤真偽所需的工作量。