มีวิธีเพิกเฉยคำเตือน FindBugs เดียวหรือไม่


194

ด้วย PMD หากคุณต้องการเพิกเฉยต่อคำเตือนคุณสามารถใช้// NOPMDเพื่อให้บรรทัดนั้นถูกละเว้น

FindBugs มีลักษณะคล้ายกันหรือไม่

คำตอบ:


309

FindBugs วิธีการเริ่มต้นที่เกี่ยวข้องกับการตั้งค่าไฟล์ XML aka ฟิลเตอร์ นี่สะดวกกว่าโซลูชัน PMD น้อยกว่าจริง ๆ แต่ FindBugs ทำงานบน bytecode ไม่ใช่ในซอร์สโค้ดดังนั้นความคิดเห็นจึงไม่ใช่ตัวเลือก ตัวอย่าง:

<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เนื่องจากการปะทะกันกับชื่อของ SuppressWarningsJava


4
คำถามโบนัส: ฉันจะหาค่าที่เหมาะสมสำหรับ "บั๊ก" ที่รายงาน (ใช้โซนาร์) ได้อย่างไร
PlanBForOpenOffice

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>
bramp

7
ผู้ใช้ Maven ควรเพิ่ม<dependency><groupId>com.google.code.findbugs</groupId><artifactId>annotations</artifactId><version>3.0.0</version><scope>provided</scope></dependency>การ POM @SuppressFBWarningsของพวกเขาหากพวกเขาต้องการที่จะใช้
jansohn

22

ตามที่คนอื่นพูดถึงคุณสามารถใช้@SuppressFBWarningsคำอธิบายประกอบ หากคุณไม่ต้องการหรือไม่สามารถเพิ่มการพึ่งพาอื่นในโค้ดของคุณคุณสามารถเพิ่มคำอธิบายประกอบลงในโค้ดของคุณได้ด้วยตัวเอง Findbugs ไม่ต้องสนใจว่า Package the Annotation คืออะไร

@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 ให้เรียกดูไฟล์ตัวกรอง XML ของคุณโดยใช้ไฟล์ -> การตั้งค่าอื่น ๆ -> การตั้งค่าเริ่มต้น -> การตั้งค่าอื่น ๆ -> FindBugs-IDEA-> ตัวกรอง -> ยกเว้นตัวกรองไฟล์ -> เพิ่ม


10

อัพเดท Gradle

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")

ดูที่นี่สำหรับข้อมูลเพิ่มเติม: findbugs Spring Annotation


1
คุณสามารถใช้compile 'net.sourceforge.findbugs:annotations:1.3.2'ไวยากรณ์แทนซึ่งจะสั้นกว่า
kosiara - Bartosz Kosarzycki

3
+1 แต่โปรดอัปเดตคำตอบของคุณด้วย: testCompile 'com.google.code.findbugs:annotations:3.0.0'ชื่อgradle และคำอธิบายประกอบ@SuppressFBWarnings
Vlad.Bachurin

8

ในขณะที่เขียนนี้ (พฤษภาคม 2018) ที่ FindBugs ดูเหมือนจะถูกแทนที่ด้วยSpotBugs การใช้SuppressFBWarningsคำอธิบายประกอบต้องใช้รหัสของคุณที่จะรวบรวมกับ Java 8 spotbugs-annotations.jarหรือในภายหลังและแนะนำการพึ่งพารวบรวมเวลาบน

การใช้ไฟล์ตัวกรองเพื่อกรองกฎ SpotBugs นั้นไม่มีปัญหาดังกล่าว เอกสารที่ได้คือที่นี่


ลิงก์ของคุณไปยัง SpotBugs ดูเหมือนว่าไม่ถูกต้อง ฉันพบมันที่spotbugs.github.ioแทน
Amedee Van Gasse

1

แม้ว่าคำตอบอื่น ๆ ของที่นี่จะใช้ได้ แต่ก็ไม่ใช่สูตรที่สมบูรณ์สำหรับการแก้ปัญหานี้

ด้วยจิตวิญญาณแห่งความสมบูรณ์:

คุณต้องมีคำอธิบายประกอบ findbugs ในไฟล์ 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 บนฟิลด์จะระงับเฉพาะคำเตือน findbugs ที่รายงานสำหรับการประกาศฟิลด์นั้นไม่ใช่ทุกคำเตือนที่เกี่ยวข้องกับฟิลด์นั้น

ตัวอย่างเช่นสิ่งนี้จะหยุดคำเตือน "ฟิลด์ที่เคยตั้งค่าเป็นโมฆะ" เท่านั้น:

@SuppressWarnings ("UWF_NULL_FIELD") สตริง s = null; ฉันคิดว่าวิธีที่ดีที่สุดที่คุณสามารถทำได้คือแยกรหัสด้วยคำเตือนเป็นวิธีที่เล็กที่สุดที่คุณสามารถทำได้จากนั้นจึงหยุดการเตือนบนวิธีทั้งหมด


8
java.lang.SuppressWarningsไม่สามารถทำงานได้ มันมีการเก็บรักษาแหล่งที่มาดังนั้นจึงไม่สามารถมองเห็นข้อบกพร่องได้
ฟิลิปแอสตัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.