2008年12月8日

FindBugs 自動找出程式碼的臭蟲

在閱讀《Effective Java(2nd Ed.)》時發現新東西,FindBugs是一套專為Java程式碼除錯的工具,採LGPL授權的自由軟體,它利用Bug Pattern自動檢查出程式碼可能發生的錯誤,因此在軟體發佈之前用它做一次徹底檢查,就有機會減少Bug在客戶使用時才發生的機會。FindBugs可以用Command-line方式執行,也有提供簡易GUI介面,更方便的使用方式,是搭配Apache Ant或Eclipse等開發工具,讓程式碼Debug的工作變成自動化流程的一部分。

即使是有經驗的程式設計師,仍無法免於Bug的發生。Java的WORA(Write once, run anywhere)特性,有人說應該是WODA(Write once, debug anywhere)才對,雖然這句玩笑話還蠻常真的發生,但也某種程度代表了程式開發時必須認真看待Bug的態度。往往我們在寫程式時,只能夠先考慮在固定條件下,程式沒有語法錯誤、並能夠通過設定的測試案例,例如特定版本的軟體環境以及正確的操作流程,但是當外在因素改變時,Bug就誕生了。幸好Java比起C/C++程式算是容易除錯,甚至有FindBugs這樣的軟體可以幫助除錯。

FindBugs使用bug patterns找尋可能導致錯誤的程式碼,它分析的對象是Java bytecode(編譯出來的*.class)檔案,所以即時沒有原始碼也還是能夠使用。被FindBugs警告可能引發錯誤,並不能夠完全代表一定真的存在錯誤,誤判率低於50%,可以作為程式開發階段的一個錯誤偵測及預防工具。

以下是一些bug patterns可能的理由:
  • 困難的程式語言特性(Difficult language features)
  • 被誤解的API方法(Misunderstood API methods)
  • 當程式碼在維護時被修改,而存在被誤解的常數(Misunderstood invariants when code is modified during maintenance)
  • 多樣化的錯誤:打錯字、用錯布林運算元(Garden variety mistakes: typos, use of the wrong boolean operator)
舉例來說,當一個用來處理某項任務的method包含System.exit()呼叫,則當此method在某種狀況發生時,整個程式可能就因此而不正常結束,有時我們只希望這個特定的任務發生錯誤時,就放棄這個任務,而不是結束整個程式的運作,這種時候呼叫System.exit()就很危險。另一個例子是,當swtich敘述中的case未加上break,也就是當這個case條件成立時,會直接再往下一個case執行,這種情況很多時候是程式設計者忘記加上break,當然有時候故意這麼做的,但FindBugs的警告可以當作是一個提醒。

相關閱讀:

沒有留言:

張貼留言

lyhcode by lyhcode
歡迎轉載,請務必註明出處!