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.