SpotBugs 簡介
1. 概述
識別 Java 程式中的錯誤是軟體開發的關鍵挑戰。 SpotBugs是一個開源靜態分析工具,用於尋找 Java 程式碼中的錯誤。它在 Java 字節碼(而不是原始程式碼)上運行,以識別程式碼中的潛在問題,例如錯誤、效能問題或不良實踐。 SpotBugs 是 FindBugs 的繼承者,並以其功能為基礎,提供更詳細、更精確的錯誤偵測。在本文中,我們將探討如何在 Java 專案上設定 SpotBugs 並將其整合到 IDE 和 Maven 建置中。
2.錯誤模式
SpotBugs 檢查 400 多種錯誤模式,例如空指標取消引用、無限遞歸循環、Java 庫的錯誤使用和死鎖。在 SpotBugs 中,錯誤模式會透過多個變數進行分類,例如違規類型、類別、錯誤等級以及發現過程的置信度。 SpotBugs 有十個錯誤模式類別:
- 不良實踐:檢測可能不會立即導致問題但可能在將來導致問題的不良編碼實踐。範例包括哈希碼和等於問題、可複製習慣用法、丟棄的異常、
Serializable
問題以及finalize
的誤用。 - 正確性:識別可能不正確並可能導致執行時間錯誤(例如可能的錯誤)的程式碼。
- 實驗性:指相對較新、實驗性或未完全驗證的誤差模式。
- 國際化:檢測 Java 程式碼中與國際化和區域設定相關的潛在問題。
- 惡意程式碼漏洞:標記可能被攻擊者利用的程式碼。
- 多執行緒正確性:檢查多執行緒程式碼中的潛在問題,例如競爭條件和死鎖。
- 虛假隨機雜訊:旨在用作資料探勘實驗中的控制,而不是發現軟體中的實際錯誤。
- 效能:辨識不一定不正確但可能效率低的程式碼。
- 安全性:突出顯示程式碼中的安全漏洞。
- Dodgy Code :尋找不一定不正確但可疑且可能有問題的程式碼。令人困惑、異常或編寫方式會導致錯誤的程式碼。例如死本地儲存、開關失敗、未確認的強制
switch
以及已知為空值的冗餘空檢查。
SpotBugs 的功能之一是能夠將錯誤分類為不同的嚴重程度。 SpotBugs 按從 1 到 20 的數字範圍對錯誤進行排名,排名表明問題的嚴重性。數字排名可分為以下幾類:
- 最可怕(高優先) :排名 1 至 4
- 可怕(中優先) :排名 5 至 9
- 麻煩(低優先) :排名 10 至 14
- 關注(資訊) :排名 15 至 20
3.SpotBugs Maven 插件
Spotbugs 可以用作獨立應用程序,也可以透過多種整合(包括 Maven、Gradle、Eclipse 和 IntelliJ)來使用。在本節中,我們將重點關注 Maven 整合。
3.1. Maven 配置
讓我們先在pom.xml
的<plugins>
部分導入spotbugs
-maven-plugin
插件:
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
<version>4.8.5.0</version>
<dependencies>
<dependency>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs</artifactId>
<version>4.8.5</version>
</dependency>
</dependencies>
</plugin>
3.2.產生報告
添加插件後,我們可以打開終端機並運行以下命令:
mvn spotbugs:check
這會對我們的原始程式碼進行分析,然後輸出我們需要修復的警告清單。為了產生錯誤報告,我們需要一些程式碼來使用。為了簡單起見,我們將使用GitHub 上提供的專案。假設我們正在使用以下類別:
public class Application {
public static final String NAME = "Name: ";
private Application() {
}
public static String readName() {
Scanner scanner = new Scanner(System.in);
String input = scanner.next();
return NAME.concat(input);
}
}
現在,我們可以執行mvn spotbugs:check
指令。在某一點運行時偵測到以下內容:
[INFO] BugInstance size is 1
[INFO] Error size is 0
[INFO] Total bugs: 1
[ERROR] High: Found reliance on default encoding in com.baeldung.systemin.Application.readName(): new java.util.Scanner(InputStream) [com.baeldung.systemin.Application] At Application.java:[line 13] DM_DEFAULT_ENCODING
從這份報告中,我們可以看到我們的Application
類別有一個高優先級的錯誤。
3.3.查看結果
SpotBugs 在target/spotbugsXml.xml
中產生 XML 格式的報表。為了獲得更漂亮的報告,我們需要在 SpotBugs 外掛程式中加入htmlOutput
配置:
<configuration>
<htmlOutput>true</htmlOutput>
</configuration>
現在,我們執行mvn clean install
和mvn spotbugs:check
指令。然後,我們導航到target/spotbugs.html
並打開該檔案以直接在瀏覽器中查看結果:
此外,我們還可以使用 Maven 命令
mvn spotbugs:gui
使用 Spotbugs GUI 查看錯誤詳細資訊:
有了這些回饋,我們現在可以更新程式碼以主動修復錯誤。
3.4.修復錯誤
我們的Application
類別有DM_DEFAULT_ENCODING
錯誤。此錯誤表示在執行 I/O 操作時使用預設字元編碼。如果預設編碼在不同環境或平台上有所不同,這可能會導致意外行為。透過明確指定字元編碼,無論平台的預設編碼為何,我們都可以確保一致的行為。為了解決這個問題,我們可以將StandardCharsets
加入Scanner
類別:
public static String readName() {
Scanner scanner = new Scanner(System.in, StandardCharsets.UTF_8.displayName());
String input = scanner.next();
return NAME.concat(input);
}
新增先前建議的變更後,再次執行mvn spotbugs:check
會產生無錯誤報告:
[INFO] BugInstance size is 0
[INFO] Error size is 0
[INFO] No errors/warnings found
4.SpotBugs IntelliJ IDEA 插件
IntelliJ SpotBugs 外掛程式提供靜態位元組程式碼分析,可從 IntelliJ IDEA 中尋找 Java 程式碼中的錯誤。該插件在底層使用了 SpotBugs。
4.1.安裝
要在 IntelliJ IDEA 中安裝 SpotBugs 插件,我們打開應用程式並導航到「 Welcome Screen
」。如果專案已打開,我們轉到“ File -> Settings
”(或 macOS 上的“ IntelliJ IDEA -> Preferences”
)。在設定視窗中,我們選擇“ Plugins
”,然後轉到“ Marketplace
”標籤。使用搜尋欄,我們找到“ SpotBugs
”,找到後,點擊“ Install
”按鈕。安裝完成後,我們重新啟動IntelliJ IDEA來啟用外掛程式:
對於手動安裝 SpotBugs 插件,我們首先從JetBrains 插件儲存庫下載該插件。下載插件 zip 檔案後,我們打開 IntelliJ IDEA 並導航到“
Welcome Screen
”,然後轉到“ File > Settings
”。在設定視窗中,我們選擇“ Plugins
”,點擊右上角的“ Gear Icon
”,然後選擇“ Install Plugin from Disk
”。然後,我們導航到下載 SpotBugs 插件 zip 檔案的位置,選擇它,然後按一下「 OK
」。最後,我們重新啟動IntelliJ IDEA以啟動插件。
4.2.報告瀏覽
為了在IDEA中啟動靜態分析,我們可以在SpotBugs-IDEA面板中點擊“ Analyze Current File
”,然後檢查結果:
我們可以使用螢幕截圖左側的第二列命令按各種因素對錯誤進行分組,例如錯誤類別、類別、套件、優先順序或錯誤等級。也可以透過點擊命令第三列中的「
export
」按鈕以 XML/HTML 格式匯出報告。
4.3.配置
IntelliJ IDEA 的 SpotBugs 外掛程式提供了各種首選項和設置,讓使用者可以自訂分析流程並管理錯誤的報告方式。下圖顯示了 SpotBugs 外掛程式首選項:
以下是 SpotBugs 外掛程式中可用的典型首選項的概述:
- Bug 類別和優先順序:我們可以設定希望 SpotBugs 偵測的 bug 類別。我們還可以設定錯誤偵測的最低等級,使我們能夠專注於更關鍵的問題。
- 過濾檔案:此標籤允許我們管理程式碼庫的哪些部分包含在分析中或從分析中排除。我們可以定義模式以從分析中排除或包含特定的套件、類別或方法。
- 註解:此插件支援為類別、方法和欄位配置註解。這些註釋可用於抑制特定警告或向 SpotBugs 提供附加資訊。
- Detector :它提供與 SpotBugs 使用的偵測機制相關的設定。我們可以根據需要啟用或停用特定的錯誤偵測器。例如,人們可以透過啟用與安全性相關的偵測器並停用其他偵測器來關注安全性問題。
這些首選項和設定提供了對 SpotBugs 如何分析程式碼和報告潛在問題的靈活性和控制,幫助開發人員保持較高的程式碼品質並有效解決錯誤。
5.SpotBugs Eclipse 插件
在本節中,我們將重點放在 SpotBugs Eclipse 插件,深入研究其安裝過程以及在 Eclipse IDE 中的使用情況。
5.1.安裝
我們首先啟動 Eclipse IDE 並導航到功能表列中的「 Help
」。之後,我們選擇「 Eclipse Marketplace
」。在 Marketplace 視窗中,我們在搜尋框中輸入“ SpotBugs
”,然後按“ Enter
”。當搜尋結果出現時,我們找到SpotBugs並點擊它旁邊的「 Install
」按鈕。我們依照安裝精靈完成安裝程序。最後,我們重新啟動Eclipse來啟動外掛:
或者,如果「
Eclipse Marketplace
」中沒有 SpotBugs,或者我們更喜歡透過更新網站安裝它,我們可以打開 Eclipse 並轉到頂部的「 Help
」選單。從下拉式選單中,我們選擇“ Install New Software
”,然後點擊出現的對話方塊中的“ Add
”按鈕。在“ Add Repository
”對話框中,我們輸入儲存庫的名稱,例如“ SpotBugs
”,並在“ Location
”欄位中輸入https://spotbugs.github.io/eclipse
URL。點擊“ OK
”後,我們在可用軟體清單中勾選“ SpotBugs
”旁邊的複選框,點擊“ Next
”,並按照提示完成安裝。最後,我們重新啟動Eclipse以啟動外掛程式。
5.2.報告瀏覽
要使用 SpotBugs Eclipse 外掛程式對專案啟動靜態分析,我們需要在「 Project Explorer
」中右鍵單擊該項目,然後導覽至「 SpotBugs -> Find Bugs
」。之後,Eclipse 在「 Bug Explorer
」視窗下顯示結果。
5.3.配置
我們可以透過「 Window -> Preferences -> Java -> SpotBugs
」來查看設定介面:
我們可以自由地取消選取不需要的類別,提高報告的最低排名,指定報告的最低置信度,以及自訂錯誤排名的標記。在「
Detector configuration
」標籤下,Eclipse SpotBugs 外掛程式可讓我們自訂啟用或停用哪些錯誤偵測器。此選項卡提供了可用檢測器的詳細列表,每個檢測器都旨在識別代碼中特定類型的潛在問題。在「 Filter files
」面板下,我們可以建立自訂檔案過濾器,讓我們在 SpotBugs 分析中包含或排除特定檔案或目錄。此功能可對分析程式碼庫的哪些部分進行微調控制,確保錯誤偵測過程中不包含不相關或非必要的檔案。
六,結論
在本文中,我們討論了在 Java 專案中使用 SpotBugs 的基本要點。 SpotBugs 是一種靜態分析工具,可透過檢查字節碼來幫助識別程式碼中的潛在錯誤。我們學習如何使用 Maven(Java 生態系統中廣泛使用的建置自動化工具)來設定 SpotBugs,以自動偵測建置流程中的問題。此外,我們還介紹了將 SpotBugs 整合到流行的開發環境(包括 IntelliJ IDEA 和 Eclipse)中的流程,確保我們可以輕鬆地將錯誤檢測納入我們的工作流程中。與往常一樣,完整的原始程式碼可以在 GitHub 上取得。