Tek bir FindBugs uyarısını yok saymanın bir yolu var mı?


194

PMD ile, belirli bir uyarıyı yok saymak istiyorsanız, // NOPMDbu satırın yok sayılmasını sağlamak için kullanabilirsiniz .

FindBugs için benzer bir şey var mı?

Yanıtlar:


309

FindBugs ilk yaklaşımı, filtreler olarak da bilinen XML yapılandırma dosyalarını içerir . Bu, PMD çözümünden gerçekten daha az uygundur, ancak FindBugs kaynak kodunda değil, bayt kodunda çalışır, bu nedenle yorumların bir seçenek olmadığı açıktır. Misal:

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

Ancak, bu sorunu çözmek için FindBugs daha sonra sınıfta veya yöntem düzeyinde (bence XML'den daha uygun) kullanabileceğiniz ek açıklamalara (bkz. SuppressFBWarnings) Dayalı başka bir çözüm getirdi . Örnek (belki de en iyisi değil, ama sadece bir örnek):

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

Java ile ad çakışması nedeniyle FindBugs 3.0.0 SuppressWarningslehine kaldırıldığını unutmayın .@SuppressFBWarningsSuppressWarnings


4
Bonus Soru: Belirli bir "hata" (sonar kullanarak) için uygun değeri nasıl bulabilirim?
— PlanBForOpenOffice

29
Tabii ki ek açıklama yaklaşımını kullanmayla ilgili sorun, kodunuzun oldukça gereksiz bir şekilde Findbugs kütüphanesini ithal etmesidir (ve müteakip bağımlılık) :(
— Ashley Walton

9
Ek açıklamaların elde tutulması CLASS'dir, bu yüzden en azından sadece derleme zamanı bağımlılığı vardır
— earcam

17
Bu Maven kullanıcıları için ek açıklamaları içe aktarmak için aşağıdakileri kullanabilirsiniz. (Bonus, kapsam ayarlanır, böylece projeniz çalışma zamanında FindBugs'a bağlı değildir). <dependency> <groupId>net.sourceforge.findbugs</groupId> <artifactId>annotations</artifactId> <version>1.3.2</version> <scope>provided</scope> </dependency>
— bramp

7
Maven kullanıcıları <dependency><groupId>com.google.code.findbugs</groupId><artifactId>annotations</artifactId><version>3.0.0</version><scope>provided</scope></dependency>kullanmak istedikleri takdirde POM'larına eklemelidirler @SuppressFBWarnings.
— jansohn

22

Diğerleri Bahsedildiği gibi, @SuppressFBWarningsEk Açıklama'yı kullanabilirsiniz . Kodunuza başka bir Bağımlılık eklemek istemiyorsanız veya ekleyemiyorsanız, Ek Açıklama'yı Kodunuza kendiniz ekleyebilirsiniz, Findbugs, Ek Açıklama Paketinin hangi pakette olduğunu umursamaz.

@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 "";
}

Kaynak: https://sourceforge.net/p/findbugs/feature-requests/298/#5e88


15

İşte bir XML filtresinin daha eksiksiz bir örneği (sadece bir snippet gösterdiği ve başlangıç <FindBugsFilter>ve bitiş etiketlerini içermediği için yukarıdaki örnek kendi başına çalışmaz ):

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

Android Studio FindBugs eklentisini kullanıyorsanız, Dosya-> Diğer Ayarlar-> Varsayılan Ayarlar-> Diğer Ayarlar-> FindBugs-IDEA-> Filtre-> Filtre dosyalarını hariç tut-> Ekle'yi kullanarak XML filtre dosyanıza göz atın.


10

Sınıfı Güncelle

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

FindBugs Raporunu Bulma

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

Belirli bir mesajı bulun

böcek bul

Ek açıklamanın doğru sürümünü içe aktarın

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

Ek açıklamayı doğrudan sorunlu kodun üzerine ekleyin

@SuppressWarnings("OUT_OF_RANGE_ARRAY_INDEX")

Daha fazla bilgi için buraya bakın: findbugs Bahar Açıklaması


1
Bunun compile 'net.sourceforge.findbugs:annotations:1.3.2'yerine daha kısa olan sözdizimini kullanabilirsiniz .
— kosiara - Bartosz Kosarzycki

3
+ 1, ancak lütfen cevabınızı şununla güncelleyin: testCompile 'com.google.code.findbugs:annotations:3.0.0'not ve ek açıklama adı@SuppressFBWarnings
— Vlad.Bachurin

8

Bunu yazarken (Mayıs 2018), FindBugs'ın yerini SpotBugs almıştır . SuppressFBWarningsEk açıklamayı kullanmak için kodunuzun Java 8 veya daha yeni bir sürümle derlenmesi gerekir ve derleme zamanı bağımlılığı sağlar spotbugs-annotations.jar.

SpotBugs kurallarını filtrelemek için bir filtre dosyası kullanmanın böyle bir sorunu yoktur. Dokümantasyon burada .


SpotBugs'a bağlantınız yanlış görünüyor. Bunun yerine spotbugs.github.io'da buldum .
— Amedee Van Gasse

1

Buradaki diğer cevaplar geçerli olsa da, bunu çözmek için tam bir tarif değildir.

Bütünlük ruhuyla:

Pom dosyanızda findbugs ek açıklamalarına sahip olmanız gerekir - bunlar sadece derleme süresidir, böylece providedkapsamı kullanabilirsiniz :

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

Bu, sağlayan @SuppressFBWarningsbaşka bir bağımlılığın kullanılmasına izin verir @SuppressWarnings. Ancak, yukarıdakiler daha açıktır.

Ardından ek açıklamayı yönteminizin üstüne ekleyin:

Örneğin

@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))) { ... }

Bu, hem hatanın adını hem de hata taramasını devre dışı bırakmanızın bir nedenini içerir.


-6

Bunu burada bırakacağım: https://stackoverflow.com/a/14509697/1356953

Bunun java.lang.SuppressWarningsayrı bir ek açıklama kullanmaya gerek olmadığını unutmayın .

@SuppressWar alanı üzerindeki uyarılar, yalnızca o alan bildirimi için bildirilen findbugs uyarılarını bastırır, bu alanla ilişkili her uyarıyı bastırmaz.

Örneğin, bu "Yalnızca hiç boş değere ayarlanmış alan" uyarısını bastırır:

@SuppressWarnings ("UWF_NULL_FIELD") Dize s = null; Ben yapabileceğiniz en iyi uyarı ile kodunu en küçük yöntem içine izole olduğunu düşünüyorum, daha sonra tüm yöntemi uyarı bastırmak olduğunu düşünüyorum.


8
java.lang.SuppressWarningsçalışamaz. Kaynak tutma özelliğine sahiptir, bu nedenle findbugs tarafından görülemez.
— Philip Aston
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.