回答
在FindBugs和PMD旁邊,還有Bandera,ESC/Java和JLint。你可以找到它們的比較here (PDF)。以下是相關的摘錄:
Bug Category - Example | ESC | FindBugs | JLint | PMD --------------------------------------------------+-----+----------+-------+----- General - Null dereference | V | V | V | V Concurrency - Possible deadlock | V | V | V | V Exceptions - Possible unexpexted exception | V | | | Array - Length may be less than zero | V | | V | Mathematics - Division by zero | V | | V | Conditional, loop - Unreachable code | | V | | V String - Checking equality using == or != | | V | V | V Object overriding - Equal objects/equal hashcodes | | V | V | V I/O stream - Stream not closed on all paths | | V | | Unused or duplicate statement - Unused local | | V | | V Design - Should be a static inner class | | V | | Unnecessary statement - Unnecessary return | | | | V
注:這篇文章是從2004年開始這些工具可以在同時進行了改進。
正如您所見,FindBugs和PMD找到了很多,也是最流行的靜態分析工具。但是,現在一些智能IDE也包含了一些要點,例如空默認,未使用的本地代碼和無法訪問的代碼。 Eclipse例如可以警告他們。
即使世界在這裏的Java靜態分析工具列表:http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis#Java
FindBugs的是因爲我個人最喜歡它的易於使用的界面,全面的分析,再加上有Eclipse和想法的插件。
+1對於任何Eclipse用戶來說,Findbugs都是不錯的選擇。 – helpermethod 2010-05-13 14:59:47
Findbugs幾乎是標準,因爲它非常強大(對於從研究開始的工具),定期維護,並且最近的版本確實覆蓋了大部分基礎。它還具有良好的Eclipse集成和多種過濾和排序選項,可讓您實現首選的信噪比。我只希望它可以提供建議的工作流程,所以我可以選擇忽略特定的實例(例如,對於我無法控制的代碼),只能看到更改。當我有備用內核時,持續分析也很好。
我熟悉幾種非常有前途的研究工具,它們使用靜態分析來檢查API一致性或線程分析。不幸的是,他們中沒有一個是真正的生產質量,他們需要開發者的一些投資。
This page有一些開放源代碼分析器的列表(小描述)。
我建議你在IntelliJ中使用代碼分析器。它有超過600個易於打開和關閉的檢查,但主要原因是許多檢查有快速修復。
如果你只是運行一個報告,你可能會發現1000或10,000s的標記問題。這對於解決每個問題通常價值非常小但存在引入錯誤的真實風險時可能非常乏味。然而,IntelliJ讓你在幾分鐘內選擇並修復1000多個問題,並且可以降低引入錯誤的風險。
IntelliJ CE是開源且免費的並具有此功能。
- 1. 在代碼的靜態分析中,究竟是什麼陰影?
- 2. 靜態代碼分析Java
- 3. 什麼是好的靜態代碼分析插件?
- 4. 爲什麼我的代碼對靜態進行靜態引用?怎麼修?
- 5. 爲什麼代碼在機器上運行?
- 6. 爲什麼CodeContracts靜態分析器不會發出警告?
- 7. c#設計器運行什麼代碼?
- 8. 什麼是靜態代碼塊?
- 9. 爲什麼代碼分析在這個方法上激發CA2000?
- 10. 這段代碼爲什麼不運行?
- 11. 這段代碼爲什麼運行?
- 12. 爲什麼DNX運行兩次代碼
- 13. 爲什麼不運行此代碼?
- 14. 爲什麼會運行以下代碼?
- 15. 爲什麼此代碼無法運行?
- 16. Java:什麼是靜態{}?
- 17. 爲什麼子類的靜態代碼得到執行?
- 18. 爲什麼靜態塊中的代碼不執行?
- 19. 爲什麼你認爲分割錯誤發生在該代碼?
- 20. 靜態庫中的fPIC代碼:爲什麼?怎麼了?
- 21. 爲什麼Java中沒有靜態類
- 22. 爲什麼代碼在運行時會出現分段錯誤?
- 23. 爲什麼在malloc代碼運行之前分配內存?
- 24. 的Java靜態代碼分析
- 25. 我的Java代碼不能運行,爲什麼? (只有幾行)
- 26. 爲什麼代碼可以在Solaris上運行,但不能在Linux上運行?
- 27. 靜態分析和語義分析有什麼區別?
- 28. 爲什麼我在代碼中的out參數上得到代碼分析CA1062?
- 29. 爲什麼MutationObserver代碼不能在Chrome 30上運行?
- 30. 爲什麼這個greasemonkey/javascript代碼在冒號上運行?
我現在有兩個答案,建議Findbugs,我必須承認,它似乎是相當不錯的。這是普遍的共識嗎? – Finbarr 2010-05-13 15:01:42