今天在下面刊載一篇小王同窗寫的靜態代碼檢查報告,圖文並茂,條理清晰。html
1. 工具說明java
FindBugs 是一個靜態分析工具,它檢查類或者 JAR 文件,將字節碼與一組缺陷模式進行對比以發現可能的問題。有了靜態分析工具,就能夠在不實際運行程序的狀況對軟件進行分析。不是經過分析類文件的形式或結構來肯定程序的意圖,而是一般使用 Visitor 模式。Findbugs能夠在多個環境中運行,同時也能夠編寫本身的檢測器,功能比較完善。咱們平時能夠收集本身的或者是別人的開發經驗,把它作成檢測器來完善Findbugs的檢測體系。在網上的評價中,FindBugs工具雖然是機器掃描,效率高,可是還不夠靈活。session
FindBugs的官網爲:http://findbugs.sourceforge.net/eclipse
下載地址爲:http://findbugs.sourceforge.net/downloads.html工具
工具能夠經過命令行方式和Eclipse插件的方式兩種方式來使用,因爲是開源軟件,網站上同時附帶了源代碼包的下載。測試
Eclipse插件的下載地址爲:網站
2.使用過程spa
首先把下載到的FindBugs對Eclipse插件解壓到Eclipse安裝目錄下的Plugin目錄,啓動Eclipse,在以前加載好的工程上右鍵找到Find Bugs菜單,點擊Find Bugs,開始執行靜態代碼審查。.net
在Window菜單上選擇Show View中的Other,搜索FindBugs,選擇Bug Explorer,點擊OK,以下圖所示。
在下方的Bug Explorer中能夠查看到工具找到了一個BUG,查看其詳情。
將BUG導出爲HTML文件,獲得BUG信息以下圖。
3.缺陷統計
發現Bug:共1個
Bug編號 |
B-01 |
Bug內容 |
Store of non serializable com.neuedu.model.UserAccount into HttpSession in com.neuedu.controller.UserAccountController.doLogin(String, String, HttpSession) |
Bug提示 |
This code seems to be storing a non-serializable object into an HttpSession. If this session is passivated or migrated, an error will result. |
Bug等級 |
Troubling |
可信度 |
High |
模式 |
J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION |
類別 |
BAD_PRACTICE (Bad practice) |
Bug位置 |
UserAccountController.java: com.neuedu.controller.UserAccountController. doLogin |
4. 與同行評審對比
同行評審對程序的總體質量,可維護性、可擴展性、易用性和清晰性都進行評審,在評審過程過程當中咱們按照規範的步驟對軟件需求、設計、代碼和相關技術文檔進行仔細檢查,找到了6個缺陷和其餘代碼規範問題。
而靜態代碼檢查是由程序按照固定的庫規則進行篩選覈查,只會針對代碼的淺層邏輯進行進行審查,雖然自動化體現了機器測試的優勢,但代碼可流暢運行但與需求不符合之類的缺陷並不能查驗。這是靜態代碼檢查的不足之處,實際應用中應當作到二者結合,使用靜態代碼檢查發現簡單的邏輯錯誤,再由同行評審進行人工測試。
5. 缺陷重點分析
靜態代碼檢查發現了一個bug在UserAccountController.java文件中,該類爲用戶帳戶的控制器類com.neuedu.controller.UserAccountController,出錯發生在doLogin方法中的語句session.setAttribute("loginUser", userAccount);,在設置session的時候將不可序列化的帳戶類設置到session中,這可能在運行中使得會話不能正常保存。
修復方法:將用戶帳戶信息類實現序列化接口並提供序列化方法,並從新測試session保存會話功能。
6. 靜態代碼檢查工具優缺點
代碼檢查工具的優勢:自動化,使用機器掃描,效率較高,速度快,本次使用過程在1分鐘以內完成,能夠快捷地代替人力尋找bugs。
代碼檢查工具的缺點:不夠靈活,只能在檢查工具備的bug庫裏面找到簡單的錯誤。對於邏輯性較強的bug和結果與指望值不符的問題檢測率較低。