1. 程式人生 > >如何更好地利用Pmd、Findbugs和CheckStyle分析結果

如何更好地利用Pmd、Findbugs和CheckStyle分析結果

這裡列出了很多Java靜態分析工具,每一種工具關注一個特定的能發揮自己特長的領域,我們可以列舉一下:

工具

目的

檢查項

FindBugs

檢查.class

基於Bug Patterns概念,查詢javabytecode(.class檔案)中的潛在bug

主要檢查bytecode中的bug patterns,如NullPoint空指標檢查、沒有合理關閉資源、字串相同判斷錯(==,而不是equals)等

PMD

檢查原始檔

檢查Java原始檔中的潛在問題

主要包括:

空try/catch/finally/switch語句塊

未使用的區域性變數、引數和private方法

空if/while語句

過於複雜的表示式,如不必要的if語句等

複雜類

CheckStyle

檢查原始檔

主要關注格式

檢查Java原始檔是否與程式碼規範相符

主要包括:

Javadoc註釋

命名規範

多餘沒用的Imports

Size度量,如過長的方法

缺少必要的空格Whitespace

重複程式碼


  • Pmd 它是一個基於靜態規則集的Java原始碼分析器,它可以識別出潛在的如下問題:
    – 可能的bug——空的try/catch/finally/switch塊。
    – 無用程式碼(Dead code):無用的本地變數,方法引數和私有方法。
    – 空的if/while語句。
    – 過度複雜的表示式——不必要的if語句,本來可以用while迴圈但是卻用了for迴圈。
    – 可優化的程式碼:浪費效能的String/StringBuffer的使用。

  • FindBugs 它用來查詢Java程式碼中存在的bug。它使用靜態分析方法標識出Java程式中上百種潛在的不同型別的錯誤。

  • Checkstyle 它定義了一系列可用的模組,每一個模組提供了嚴格程度(強制的,可選的…)可配置的檢查規則。規則可以觸發通知(notification),警告(warning)和錯誤(error)。

現在有很多檢視這些工具的處理結果的方式:

  • XML格式:這些工具都可以產生XML檔案,這些XML檔案能用來產生HTML報表或者是被別的工具用來瀏覽分析的結果。
  • HTML格式:HTML格式是最受歡迎的產生報表和團隊間分享的的方式,你也可以用xsl表格建立你自己的報表。
  • IDE外掛:幾乎所有叫得上名字的IDE都給這些工具提供了外掛,這使得發現原始碼中存在的所有問題幾乎變成可能。

程式碼質量工具的一個問題是,它們有時候會給開發者提示很多不是錯誤的錯誤-也叫做假陽性(false positives)。當這種情況發生的時候,開發者可以學著忽略工具的輸出資訊,或者是把這些輸出全部拋棄掉。

為了更好的利用這些工具的輸出結果,給開發者一個更有用的檢視,最好是有一種只關注我們想要的東西的方式。本文中,我們將找出其他有趣的方式來更好的利用所有這些有名的Java靜態分析工具的輸出結果,然後可以像查詢資料庫那樣查詢這些結果。

JArchitect和CQLinq

JArchitect是另一個靜態分析工具,它彌補了其他工具(的不足),它是使用一種基於Linq(CQLinq)的程式碼查詢語言像查詢資料庫那樣來查詢程式碼。

JArchitect3的以前版本,只能查詢從JArchitect提取出來的分析資料,但是從JArchitect4開始,可以把許多其他靜態分析工具的輸出結果包含進來,然後使用CQLinq做查詢。

讓我們以PDT核心(的Php外掛)的原始碼為例來說明如何在JArchitect中利用好這些靜態工具的分析結果。

在查詢分析結果以前,要遵守以下幾個步驟:

  • 第一步:

用PMD,CPD,FindBugs和CheckStyle分析專案工程,生成包含分析結果的XML檔案。

  • 第二步:

用JArchitect分析專案工程。

  • 第三步:

在JArchitect點選選單“外掛(Plugins)”->“匯入外掛結果檔案(Import Plugins Result Files)”把所有的XML檔案匯入到JArchitect中。

JArchitect預設給這些工具提供了許多有用的查詢,並且這些查詢都是可以很簡單的進行定製的。

讓我們來看一些CQLinq的查詢:

獲取的所有的問題(issue):

獲取所有問題的請求很簡單,但是沒什麼用處,因為如何利用23272個問題的分析結果確實是一個很大的挑戰。

為了更好的利用這些工具的分析結果,我們可以用CQLinq來做過濾,然後只關注那些我們想要關注的東西。

根據所使用的檢查工具發請求

我們可以修改第一個請求,然後新增一個查詢工具的criteria。

據規則集發請求

我們也可以根據問題的規則集做過濾:

根據優先順序發請求

也可以根據優先順序做過濾:

出現次數最多的問題

知道哪些問題是被這些工具報告次數最多的是很有用的。

出現問題最多的類

知道哪些類包含了最多的問題是很有用的。

上圖可以看出來,CheckStyle報告的上千個問題中有很多是可以忽略的。

前面的查詢很有用,但是,它並沒有給我們一個精確的類質量的資訊,因為要考慮的另一個有用的維度就是程式碼行數(NBLinesOfCode)。一般來說程式碼行數多的類會包含更多的問題,基於這個考慮,我們可以修改之前的請求來計算出問題數目和程式碼行數(NBLinesOfCode)的比率。

上面的查詢結果看上去很奇怪,前8個類的問題數和程式碼行數比率超過了200,也就是說一行程式碼有超過200個問題。

為了解釋這種行為,我們看下CompilerAstParser的一些程式碼:

程式碼行數(NBLinesOfCode)指的是語句的數目而不是程式碼的物理行數,CompilerAstParser這個類聲明瞭很多陣列,每一個都包含了幾千個物理行,但是,每一個數組都被認為是一個語句。

就像前面展示的出現次數最多的問題那樣,每一個數組都把”+應該在一個新行上”這個規則違反了上千次。或許最好是應該把這樣的規則從CheckStyle的配置檔案中刪掉。

出問題最多的方法

當靜態警察工具報告了問題以後,定位解決問題的優先順序是很有用的,尤其是當包含bug的時候。

bug可能存在於某一個特定的方法中,但是,知道還有多少方法也受這個bug的影響是非常有用的。知道了出問題最多的這個方法做好事儘快把它解決掉。

使用CQLinq,我們可以把這些工具的結果和JArchitect的結果結合起來創建出更復雜的查詢,然後把這些檢查規則新增到構建過程中去。

問題的趨勢

工程中有問題並不是異常情況,我們甚至可以說是正常的,但是,我們要檢查工程的質量趨勢。如果隨著工程的更新和演化問題數目增加了,將會是一個很壞的指標。

JArchitect提供了趨勢監控特性來建立趨勢圖。趨勢圖是根據分析時間記錄的特定維度上的值創建出來的。預設有50多個趨勢維度,也可以很簡單定製趨勢維度。

下面給Pmd問題建立一個趨勢維度:

然後,你就可以很簡單的建立趨勢圖在趨勢維度上做監控,然後把它新增到JArchitect的操作面板中。

有了這個趨勢圖,我們就可以監視Pmd問題的進化,然後發現這個維度的問題隨版本進化的原因。

定製JArchitect報表

JArchitect可以在列出了CQLinq查詢的HTML報表中追加額外的報表區。

在CQLinq查詢瀏覽面板中,一個特定的CQLinq組是用橙色的的邊框包圍的。

也可以把Pmd趨勢圖新增到報表中:

在HTML報表中,這些被新增進來的區域可以通過選單訪問:

這是被新增進Pmd查詢報表中的頁面:

結論

JArchitect 4 對其他的靜態分析工具是開放的,你也可以很簡單的像本文說的那樣把你自己的工具做成它的外掛。這樣你就可以使用JArchitect的所有的功能來更好的利用那些有名的java靜態分析工具的分析結果。

相關推薦

如何利用PmdFindbugsCheckStyle分析結果

這裡列出了很多Java靜態分析工具,每一種工具關注一個特定的能發揮自己特長的領域,我們可以列舉一下: 工具 目的 檢查項 FindBugs 檢查.class 基於Bug Patterns概念,查詢javabytecode(.class檔案)中

DevOps服務:規劃協作快速交付

DevOps 是一個不斷進化的框架和哲學,不斷推動著如何更好更快的進行應用程式的開發和快速進行新機能的迭代釋出,以便快速的響應客戶需求和交付客戶產品。DevOps實踐使得開發Team和IT運維Team能夠以一種透明且可見的方式進行持續的溝通,整合,協作。 因此,這種開發

JavaScript是如何工作的:事件迴圈非同步程式設計的崛起 + 5種使用 async/await 編碼方式!

摘要: 深度理解JS事件迴圈!!! 原文:JavaScript是如何工作的:事件迴圈和非同步程式設計的崛起+ 5種使用 async/await 更好地編碼方式! 作者:前端小智 Fundebug經授權轉載,版權歸原作者所有。 此篇是 JavaScript是如何工作的第四篇,其它三篇可以看這

JavaScript是如何工作的:事件循環異步編程的崛起 + 5種使用 async/await 編碼方式!

www 輸入數據 實例 事件 學術 scrip 界面 永遠 oom 摘要: 深度理解JS事件循環!!! 原文:JavaScript是如何工作的:事件循環和異步編程的崛起+ 5種使用 async/await 更好地編碼方式! 作者:前端小智 Fundebug經授權轉載,版

理清javascript中prototype__proto__ObjectFunction的關係,理解原型繼承

結論1:Object.prototype只是一個普通物件,它是js原型鏈的最頂端。 (typeof Object.prototype) === object;//true Object.prot

群用戶通過微信小程序可以協作了

bug space 隱藏 針對 簡單 完整 script 寬度 table   今天,小程序向開發者開放了群ID的接口能力。簡單地說,就是當你把小程序分享在群聊中,被點擊後開發者可獲取群ID和群名稱,也方便更好地針對群場景提供個性化服務。不同的群有各自的群ID,那麽這個新能

MQTT是IBM開發的一個即時通訊協議,構建於TCP/IP協議上,是物聯網IoT的訂閱協議,借助消息推送功能,可以實現遠程控制

集合 cap 消息處理 簡易 遠程控制 mes ogr 設計思想 成本 最近一直做物聯網方面的開發,以下內容關於使用MQTT過程中遇到問題的記錄以及需要掌握的機制原理,主要講解理論。 背景 MQTT是IBM開發的一個即時通訊協議。MQTT構建於TCP/IP協議上

三維人臉識別技術使我們認識彼此

直觀 關聯 post 識別 模型 最小 部門 蘋果 tle 人臉識別,一種基於人的臉部特征信息進行身份認證的生物特征識別技術。近年來,隨著歐美發達國家人臉識別技術開始進入實用階段後,人臉識別迅速成為近年來全球的一個市場熱點,它具有如下顯著優點: ·非接觸,智能交互,用戶接

009 如何進行溝通

朋友 華爾街 整體 顧問 慢慢 裏的 alt 發出 失敗 一個原則一套技巧一個情景一個模型 所以,我們需要怎麽做呢? 要點法 例:經理,關於和貓咪公司的合作事宜,對方提了這麽3個條件:1)xx

程序員如何在百忙中有效利用時間,如何不走岔路,不白忙(忙得要有效率,要有收獲)-----https://www.cnblogs.com/JavaArchitect/p/9080484.html

logs 有效 時間 hit 收獲 AR log title blog https://www.cnblogs.com/JavaArchitect/p/9080484.html 程序員如何在百忙中更有效地利用時間,如何不走岔路,不白忙(忙得要有效率,要有收獲) 程序員如何

如何進行項目工時管理?

項目工時管理 工時管理軟件 軟件定制開發項目太多項目工時無法實時掌控;項目成員總是忘記填報工時;工時上報不合理導致項目成本不可控;很多工時管理系統復雜不易很快上手,且費用較高難以接受;數據易丟失,不便於統計。那怎樣才能更好地實時把握項目的工時成本呢?怎樣才能讓員工更好地完成項目工時上報呢?怎樣才能避免需要親自

如何讓搜尋引擎理解我們想要什麼

能否有效地利用搜索引擎,對我們能否在海量資訊中迅速挖掘出所需有著決定性影響。 本文的源起是今天讀完的一本谷歌前高管寫的書《 Google 時代的工作方法》,其中一章提到對於關於谷歌搜尋的高效運用,加之先前看過為數不少的關於搜尋引擎運用的文章,結合自己平時的搜尋習慣,出於更好地理解和運用的目的,方有此文。 本

Android資料庫高手祕籍(十)——如何在Kotlin中使用LitePal

轉載請註明出處:https://blog.csdn.net/guolin_blog/article/details/82714414 本文同步發表於我的微信公眾號,掃一掃文章底部的二維碼或在微信搜尋 郭霖 即可關注,每個工作日都有文章更新。 自從LitePal在2.

何愷明大神的「Focal Loss」,如何理解?

轉自:http://blog.csdn.net/c9Yv2cf9I06K2A9E/article/details/78920998   作者丨蘇劍林 單位丨廣州火焰資訊科技有限公司 研究方向丨NLP,神經網路 個人主頁丨kexue.fm   前言

Ubuntu中使用Source Insight

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

如何在 JavaScript 中使用陣列

本文短小精悍,我保證。在過去的數個月裡,我注意到在我審閱的 pull request 中有四個(關於陣列使用的)錯誤經常出現。同時,我自己也會犯這些錯誤,因此有了這篇文章。讓我們一起學習,以確保以後能正確地使用陣列方法! 使用 Array.includes 替代 Array.

如何在javaScript中使用陣列

夥伴們好!本文對比了以下兩組關於陣列的操作方法: 1、Array.indexOf 、 Array.includes、Array.some; 2、Array.find 與 Array.filter; 1、Array.indexOf 、 Array.includes

怎麼終極理解遞迴演算法【轉】

遞迴真是個奇妙的思維方式。對一些簡單的遞迴問題,我總是驚歎於遞迴描述問題和編寫程式碼的簡潔。但是總感覺沒能融會貫通地理解遞迴,有時嘗試用大腦去深入“遞迴”,層次較深時便常產生進不去,出不來的感覺。這種狀態也導致我很難靈活地運用遞迴解決問題。有一天,我看到一句英文:“To

【資訊科技】【2006.12】人工耳蝸在噪聲環境中識別旋律並改善語音理解的訊號處理策略

本文為美國德克薩斯大學達拉斯分校(作者:KALYAN S. KASTURI)的電子工程碩士論文,共194頁。 人工耳蝸是由植入電極和訊號處理器組成的裝置,設計用於恢復深度耳聾人群的部分聽力。自上世紀70年代初人工耳蝸誕生以來,逐漸得到廣泛普及,因此已經進行了大

Intellij IDEA 使用checkstylepmdfindbugs檢查靜態程式碼質量

checkstye、pmd、findbugs的對比 在IDEA setting-plugins 下分別搜尋 checkstyle、pmd、findbugs 安裝,安裝後要重啟IDEA。 checkstyle 如上圖開啟checkstyle面板。 可以自己設