単一のFindBugs警告を無視する方法はありますか?


回答:


308

FindBugsの最初のアプローチには、XML構成ファイル(フィルター)が含まれます。これはPMDソリューションほど便利ではありませんが、FindBugsはソースコードではなくバイトコードで機能するため、コメントは明らかにオプションではありません。例:

<Match>
   <Class name="com.mycompany.Foo" />
   <Method name="bar" />
   <Bug pattern="DLS_DEAD_STORE_OF_CLASS_LITERAL" />
</Match>

ただし、この問題を解決するために、FindBugsはアノテーションSuppressFBWarningsまたはクラスレベルで使用できる別のソリューション(を参照)を導入しました(私の意見ではXMLよりも便利です)。例(おそらく最良のものではないかもしれませんが、それは単なる例です):

@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
    value="HE_EQUALS_USE_HASHCODE", 
    justification="I know what I'm doing")

FindBugs 3.0.0以降では、Javaとの名前の衝突のため、SuppressWarnings非推奨になっていることに注意してください。@SuppressFBWarningsSuppressWarnings


4
ボーナス質問:(ソナーを使用して)報告された特定の「バグ」に適切な値を見つけるにはどうすればよいですか?
PlanBForOpenOffice 2011

29
もちろん、アノテーションアプローチを使用した場合の問題は、コードがFindbugsライブラリを不必要にインポート(およびその後の依存関係)してインポートすることです:(
Ashley Walton

9
@AshleyWaltonアノテーションの保持はCLASSであるため、少なくともコンパイル時の依存関係にすぎません
earcam

17
これらのMavenユーザーの場合、以下を使用して注釈をインポートできます。(ボーナス、プロジェクトが実行時にFindBugsに依存しないようにスコープが設定されています)。<dependency> <groupId>net.sourceforge.findbugs</groupId> <artifactId>annotations</artifactId> <version>1.3.2</version> <scope>provided</scope> </dependency>
13

7
Mavenユーザーは<dependency><groupId>com.google.code.findbugs</groupId><artifactId>annotations</artifactId><version>3.0.0</version><scope>provided</scope></dependency>、使用する場合はPOMに追加する必要があります@SuppressFBWarnings
jansohn 2015

22

他の人が言及したように、あなたは@SuppressFBWarnings注釈を使うことができます。コードに別の依存関係を追加したくない、または追加できない場合は、自分でコードに注釈を追加できます。Findbugsは、どのパッケージが注釈であるかを気にしません。

@Retention(RetentionPolicy.CLASS)
public @interface SuppressFBWarnings {
    /**
     * The set of FindBugs warnings that are to be suppressed in
     * annotated element. The value can be a bug category, kind or pattern.
     *
     */
    String[] value() default {};

    /**
     * Optional documentation of the reason why the warning is suppressed
     */
    String justification() default "";
}

ソース:https : //sourceforge.net/p/findbugs/feature-requests/298/#5e88


15

以下は、XMLフィルターのより完全な例です(上記の例は、スニペットが表示され、<FindBugsFilter>開始タグと終了タグが欠落しているため、それ自体では機能しません)。

<FindBugsFilter>
    <Match>
        <Class name="com.mycompany.foo" />
        <Method name="bar" />
        <Bug pattern="NP_BOOLEAN_RETURN_NULL" />
    </Match>
</FindBugsFilter>

Android Studio FindBugsプラグインを使用している場合は、[ファイル]-> [その他の設定]-> [デフォルト設定]-> [その他の設定]-> [FindBugs-IDEA]-> [フィルター]-> [フィルターファイルを除外]-> [追加]を使用してXMLフィルターファイルを参照します。


10

Gradleを更新する

dependencies {
    compile group: 'findbugs', name: 'findbugs', version: '1.0.0'
}

FindBugsレポートを見つける

file:///Users/your_user/IdeaProjects/projectname/build/reports/findbugs/main.html

特定のメッセージを見つける

バグを見つける

正しいバージョンのアノテーションをインポートする

import edu.umd.cs.findbugs.annotations.SuppressWarnings;

問題のコードのすぐ上に注釈を追加します

@SuppressWarnings("OUT_OF_RANGE_ARRAY_INDEX")

詳細はこちらをご覧ください:findbugs Spring Annotation


1
compile 'net.sourceforge.findbugs:annotations:1.3.2'代わりに短い構文を使用できます。
kosiara-Bartosz Kosarzycki 2016年

3
+1、ただし回答を添えてください:testCompile 'com.google.code.findbugs:annotations:3.0.0'@SuppressFBWarnings
gradle

8

これを書いている時点(2018年5月)では、FindBugsはSpotBugsに置き換えられているようですSuppressFBWarningsアノテーションを使用するには、コードをJava 8以降でコンパイルする必要があり、コンパイル時の依存関係がに導入されspotbugs-annotations.jarます。

フィルターファイルを使用してSpotBugsルールをフィルターしても、そのような問題はありません。ドキュメントはこちらです。


SpotBugsへのリンクが正しくないようです。代わりに、spotbugs.github.ioで見つけました。
Amedee Van Gasse、2018

1

ここでの他の回答は有効ですが、これを解決するための完全なレシピではありません。

完全性の精神で:

pomファイルにfindbugsアノテーションを含める必要があります。これらはコンパイル時のみなので、providedスコープを使用できます。

<dependency>
  <groupId>com.google.code.findbugs</groupId>
  <artifactId>findbugs-annotations</artifactId>
  <version>3.0.1</version>
  <scope>provided</scope>
</dependency>

これにより、@SuppressFBWarningsを提供する別の依存関係を使用できます@SuppressWarnings。ただし、上記の方が明確です。

次に、メソッドの上に注釈を追加します。

例えば

@SuppressFBWarnings(value = "RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE",
        justification = "Scanning generated code of try-with-resources")
@Override
public String get() {
    try (InputStream resourceStream =  owningType.getClassLoader().getResourceAsStream(resourcePath);
         BufferedReader reader = new BufferedReader(new InputStreamReader(resourceStream, UTF_8))) { ... }

これには、バグの名前と、スキャンを無効にする理由の両方が含まれます。


-6

私はこれをここに残します:https : //stackoverflow.com/a/14509697/1356953

これは動作するjava.lang.SuppressWarningsため、個別のアノテーションを使用する必要がないことに注意してください。

フィールドの@SuppressWarningsは、そのフィールドに関連付けられているすべての警告ではなく、そのフィールド宣言について報告されたfindbugs警告のみを抑制します。

たとえば、これは「フィールドのみがnullに設定される」という警告を抑制します。

@SuppressWarnings( "UWF_NULL_FIELD")文字列s = null; あなたができる最善のことは、警告付きのコードを可能な限り最小のメソッドに分離し、メソッド全体の警告を抑制することです。


8
java.lang.SuppressWarnings働けません。ソース保持があるため、findbugsには表示されません。
フィリップアストン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.