क्या कोई एकल FindBugs चेतावनी को अनदेखा करने का एक तरीका है?


194

पीएमडी के साथ, यदि आप एक विशिष्ट चेतावनी को अनदेखा करना चाहते हैं, तो आप उपयोग कर सकते हैं // NOPMD उस लाइन को अनदेखा करने के लिए ।

क्या फाइंडबग्स के लिए भी कुछ ऐसा ही है?

जवाबों:


308

FindBugs प्रारंभिक दृष्टिकोण में XML कॉन्फ़िगरेशन फ़ाइलें उर्फ फ़िल्टर शामिल हैं । यह वास्तव में पीएमडी समाधान की तुलना में कम सुविधाजनक है, लेकिन फाइंडबग्स, स्रोत कोड पर नहीं, बायटेकोड पर काम करता है, इसलिए टिप्पणियाँ स्पष्ट रूप से एक विकल्प नहीं हैं। उदाहरण:

<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 जावा के नाम के साथ टकराव SuppressWarningsके @SuppressFBWarningsकारण पदावनत किया गया है SuppressWarnings


4
बोनस प्रश्न: किसी दिए गए "बग" (सोनार का उपयोग करके) के लिए मुझे उचित मूल्य कैसे मिलेगा?
PlanBForOpenOffice

29
समस्या, निश्चित रूप से एनोटेशन दृष्टिकोण का उपयोग करने के साथ है कि आपका कोड अनावश्यक रूप से आयात करता है (और बाद में निर्भरता) फाइंडबग्स लाइब्रेरी :(
एशले वाल्टन

9
@AshleyWalton के एनोटेशन की अवधारण CLASS हैं, इसलिए कम से कम यह केवल एक संकलन समय पर निर्भरता है
इयरकैम

17
उन मावेन उपयोगकर्ताओं के लिए, आप एनोटेशन आयात करने के लिए निम्नलिखित का उपयोग कर सकते हैं। (बोनस, स्कोप सेट किया गया है ताकि आपका प्रोजेक्ट रनबग में FindBugs पर निर्भर न हो)। <dependency> <groupId>net.sourceforge.findbugs</groupId> <artifactId>annotations</artifactId> <version>1.3.2</version> <scope>provided</scope> </dependency>
नम

7
<dependency><groupId>com.google.code.findbugs</groupId><artifactId>annotations</artifactId><version>3.0.0</version><scope>provided</scope></dependency>यदि वे उपयोग करना चाहते हैं तो मावेन उपयोगकर्ताओं को अपने POM में जोड़ना चाहिए @SuppressFBWarnings
जनासन

22

जैसा कि अन्य ने उल्लेख किया है, आप @SuppressFBWarningsएनोटेशन का उपयोग कर सकते हैं । यदि आप अपने कोड में कोई अन्य निर्भरता नहीं चाहते हैं या नहीं जोड़ सकते हैं, तो आप अपने कोड में एनोटेशन को स्वयं जोड़ सकते हैं, फाइंडबग्स ने ध्यान नहीं दिया कि एनोटेशन पैकेज किस में है।

@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

अद्यतन करें

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

FindBugs रिपोर्ट का पता लगाएँ

फ़ाइल: ///Users/your_user/IdeaProjects/projectname/build/reports/findbugs/main.html

विशिष्ट संदेश खोजें

बग ढूंढे

एनोटेशन के सही संस्करण को आयात करें

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

आपत्तिजनक कोड के ऊपर एनोटेशन को सीधे जोड़ें

@SuppressWarnings("OUT_OF_RANGE_ARRAY_INDEX")

अधिक जानकारी के लिए यहां देखें: फाइंडबग्स स्प्रिंग एनोटेशन


1
आप compile 'net.sourceforge.findbugs:annotations:1.3.2'सिंटैक्स का उपयोग कर सकते हैं जो कम है।
कोसीरा - बार्टोज़ कोसार्की

3
+1, लेकिन कृपया अपने जवाब के साथ अपडेट करें: testCompile 'com.google.code.findbugs:annotations:3.0.0'@SuppressFBWarnings
ग्रेड

8

इसे लिखने के समय (मई 2018), फाइंडबग्स को स्पॉटबग्स द्वारा प्रतिस्थापित किया गया लगता है । SuppressFBWarningsएनोटेशन का उपयोग करने के लिए आपके कोड को जावा 8 या बाद में संकलित करने की आवश्यकता होती है और एक संकलन समय निर्भरता का परिचय देता हैspotbugs-annotations.jar

स्पॉटबग्स नियमों को फ़िल्टर करने के लिए फ़िल्टर फ़ाइल का उपयोग करने से ऐसा कोई समस्या नहीं होती है। प्रलेखन यहाँ है


स्पॉटबग्स से आपका लिंक गलत प्रतीत होता है। मैंने इसके बजाय स्पॉटबगसेगिथब्यू.आईओ में पाया ।
अमेदी वान गेस

1

हालांकि यहाँ पर अन्य उत्तर मान्य हैं, वे इसे हल करने के लिए एक पूर्ण नुस्खा नहीं हैं।

पूर्णता की भावना में:

आपको अपनी pom फ़ाइल में खोजबिन एनोटेशन की आवश्यकता है - वे केवल संकलन समय हैं, इसलिए आप 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 केवल उस फ़ील्ड घोषणापत्र के लिए रिपोर्ट किए गए खोजबग्स चेतावनी को दबाती है, न कि उस फ़ील्ड से जुड़ी प्रत्येक चेतावनी।

उदाहरण के लिए, यह "फील्ड केवल कभी शून्य करने के लिए सेट" चेतावनी को दबाता है:

@SuppressWarnings ("UWF_NULL_FIELD") स्ट्रिंग s = null; मुझे लगता है कि आप जो सबसे अच्छा कर सकते हैं वह कोड को चेतावनी के साथ अलग कर सकता है सबसे छोटी विधि जिसे आप कर सकते हैं, फिर पूरी विधि पर चेतावनी को दबाएं।


8
java.lang.SuppressWarningsकाम नहीं कर सकता। इसका सोर्स रिटेंशन है, इसलिए इसमें फाइबग्स नहीं दिख रहा है।
फिलिप एस्टन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.