Có cách nào để bỏ qua một cảnh báo FindBugs không?


194

Với PMD, nếu bạn muốn bỏ qua một cảnh báo cụ thể, bạn có thể sử dụng // NOPMDđể bỏ qua dòng đó.

Có cái gì đó tương tự cho FindBugs không?

Câu trả lời:


308

Cách tiếp cận ban đầu FindBugs liên quan đến các tệp cấu hình XML hay còn gọi là các bộ lọc . Điều này thực sự không thuận tiện hơn giải pháp PMD nhưng FindBugs hoạt động trên mã byte, không phải trên mã nguồn, vì vậy các bình luận rõ ràng không phải là một lựa chọn. Thí dụ:

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

Tuy nhiên, để giải quyết vấn đề này, FindBugs sau đó đã giới thiệu một giải pháp khác dựa trên các chú thích (xem SuppressFBWarnings) mà bạn có thể sử dụng ở lớp hoặc ở cấp phương thức (theo ý kiến ​​của tôi thuận tiện hơn XML). Ví dụ (có thể không phải là ví dụ tốt nhất nhưng, vâng, đó chỉ là một ví dụ):

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

Lưu ý rằng vì FindBugs 3.0.0 SuppressWarningsđã không được hỗ trợ @SuppressFBWarningsvì xung đột tên với Java SuppressWarnings.


4
Câu hỏi thưởng: Làm cách nào để tìm giá trị phù hợp cho một "lỗi" đã báo cáo (sử dụng sonar)?
PlanBForOpenOffice

29
Vấn đề, tất nhiên với việc sử dụng phương pháp chú thích là mã của bạn thay vì nhập không cần thiết (và phụ thuộc tiếp theo) thư viện Findbugs :(
Ashley Walton

9
@AshleyWalton lưu giữ chú thích là LỚP, vì vậy ít nhất nó chỉ là một phụ thuộc thời gian biên dịch
Earcam

17
Đối với những người dùng Maven đó, bạn có thể sử dụng thông tin sau để nhập chú thích. (Phần thưởng, phạm vi được đặt để dự án của bạn không phụ thuộc vào FindBugs khi chạy). <dependency> <groupId>net.sourceforge.findbugs</groupId> <artifactId>annotations</artifactId> <version>1.3.2</version> <scope>provided</scope> </dependency>
bramp 16/12/13

7
Người dùng Maven nên thêm <dependency><groupId>com.google.code.findbugs</groupId><artifactId>annotations</artifactId><version>3.0.0</version><scope>provided</scope></dependency>vào POM của họ nếu họ muốn sử dụng @SuppressFBWarnings.
jansohn

22

Như những người khác đã đề cập, bạn có thể sử dụng @SuppressFBWarningsChú thích. Nếu bạn không muốn hoặc không thể thêm Phụ thuộc khác vào mã của mình, bạn có thể tự thêm Chú thích vào Mã của mình, Findbugs không quan tâm đến Gói chú thích nào.

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

Nguồn: https://sourceforge.net/p/findbugs/feature-requests/298/#5e88


15

Dưới đây là một ví dụ đầy đủ hơn về bộ lọc XML (ví dụ ở trên sẽ không hoạt động vì nó chỉ hiển thị một đoạn mã và thiếu các <FindBugsFilter>thẻ bắt đầu và kết thúc):

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

Nếu bạn đang sử dụng plugin FindBugs của Android Studio, hãy duyệt đến tệp bộ lọc XML của bạn bằng Tệp-> Cài đặt khác-> Cài đặt mặc định-> Cài đặt khác-> FindBugs-IDEA-> Bộ lọc-> Loại trừ tệp bộ lọc-> Thêm.


10

Cập nhật lớp

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

Xác định vị trí báo cáo FindBugs

tệp: ///Users/your_user/IdeaProjects/projectname/build/reports/findbugs/main.html

Tìm thông điệp cụ thể

tìm lỗi

Nhập phiên bản chính xác của chú thích

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

Thêm chú thích ngay phía trên mã vi phạm

@SuppressWarnings("OUT_OF_RANGE_ARRAY_INDEX")

Xem ở đây để biết thêm: findbugs Spring Annotation


1
Bạn có thể sử dụng compile 'net.sourceforge.findbugs:annotations:1.3.2'cú pháp thay vì ngắn hơn.
kosiara - Bartosz Kosarzycki

3
+1, nhưng vui lòng cập nhật câu trả lời của bạn với: tên lớp testCompile 'com.google.code.findbugs:annotations:3.0.0'và chú thích@SuppressFBWarnings
Vlad.Bachurin

8

Tại thời điểm viết bài này (tháng 5 năm 2018), FindBugs dường như đã được thay thế bởi SpotBugs . Sử dụng SuppressFBWarningschú thích đòi hỏi mã của bạn phải được biên dịch bằng Java 8 trở lên và giới thiệu một phụ thuộc thời gian biên dịch vào spotbugs-annotations.jar.

Sử dụng tệp bộ lọc để lọc quy tắc SpotBugs không có vấn đề như vậy. Các tài liệu ở đây .


Liên kết của bạn đến SpotBugs dường như không chính xác. Tôi đã tìm thấy nó tại spotbugs.github.io thay thế.
Amedee Van Gasse

1

Mặc dù các câu trả lời khác ở đây là hợp lệ, nhưng chúng không phải là một công thức đầy đủ để giải quyết vấn đề này.

Trên tinh thần hoàn thiện:

Bạn cần phải có các chú thích tìm kiếm trong tệp pom của mình - chúng chỉ biên dịch thời gian, vì vậy bạn có thể sử dụng providedphạm vi:

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

Điều này cho phép sử dụng @SuppressFBWarningscó một phụ thuộc khác cung cấp @SuppressWarnings. Tuy nhiên, ở trên là rõ ràng hơn.

Sau đó, bạn thêm chú thích phía trên phương thức của bạn:

Ví dụ

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

Điều này bao gồm cả tên của lỗi và cũng là lý do tại sao bạn vô hiệu hóa quá trình quét tìm nó.


-6

Tôi sẽ để cái này ở đây: https://stackoverflow.com/a/14509697/1356953

Xin lưu ý rằng điều này hoạt động với java.lang.SuppressWarningsvì vậy không cần phải sử dụng một chú thích riêng.

@SuppressWarnings trên một trường chỉ ngăn chặn các cảnh báo tìm kiếm được báo cáo cho khai báo trường đó, không phải mọi cảnh báo liên quan đến trường đó.

Ví dụ: điều này ngăn chặn cảnh báo "Trường chỉ được đặt thành null":

@SuppressWarnings ("UWF_NULL_FIELD") Chuỗi s = null; Tôi nghĩ điều tốt nhất bạn có thể làm là tách mã với cảnh báo thành phương thức nhỏ nhất bạn có thể, sau đó loại bỏ cảnh báo trên toàn bộ phương thức.


8
java.lang.SuppressWarningskhông thể làm việc Nó có khả năng duy trì nguồn, vì vậy không thể nhìn thấy đối với các findbugs.
Philip Aston
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.