단일 FindBugs 경고를 무시하는 방법이 있습니까?


194

PMD를 사용하면 특정 경고를 무시하려는 경우 // NOPMD해당 줄을 무시할 수 있습니다.

FindBugs와 비슷한 것이 있습니까?

답변:


309

FindBugs의 초기 접근 방식은 필터 인 XML 구성 파일을 포함 합니다 . 이것은 PMD 솔루션보다 편리하지 않지만 FindBugs는 소스 코드가 아닌 바이트 코드에서 작동하므로 주석은 분명히 옵션이 아닙니다. 예:

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

그러나이 문제를 해결하기 위해 FindBugs는 나중에 클래스 또는 메소드 수준 (내 의견으로는 XML보다 편리함)에서 사용할 수있는 주석을 기반으로 한 다른 솔루션을 소개했습니다 (참조 SuppressFBWarnings). 예 (가장 좋은 것은 아니지만 예일뿐입니다) :

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

Java와의 이름 충돌로 인해 FindBugs 3.0.0 SuppressWarnings이 더 이상 사용되지 않습니다 .@SuppressFBWarningsSuppressWarnings


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는 주석이있는 패키지를 신경 쓰지 않습니다.

@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

Gradle 업데이트

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

FindBugs 보고서를 찾습니다

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

특정 메시지 찾기

버그 찾기

올바른 버전의 주석을 가져옵니다.

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

문제 코드 바로 위에 주석 추가

@SuppressWarnings("OUT_OF_RANGE_ARRAY_INDEX")

자세한 정보는 here : findbugs Spring Annotation


1
compile 'net.sourceforge.findbugs:annotations:1.3.2'더 짧은 구문을 대신 사용할 수 있습니다 .
kosiara-Bartosz Kosarzycki

3
+1,하지만 친절과 답을 업데이트 : Gradle을 testCompile 'com.google.code.findbugs:annotations:3.0.0'및 주석의 이름을@SuppressFBWarnings
Vlad.Bachurin

8

이 글을 쓰는 시점 (2018 년 5 월), FindBugs는 SpotBugs 로 대체 된 것으로 보입니다 . SuppressFBWarnings주석을 사용 하려면 코드를 Java 8 이상으로 컴파일해야하고에 컴파일 시간 종속성이 있어야합니다 spotbugs-annotations.jar.

필터 파일을 사용하여 SpotBugs 규칙을 필터링하는 것은 그러한 문제가 없습니다. 설명서는 여기에 있습니다 .


SpotBugs에 대한 링크가 올바르지 않은 것 같습니다. 대신 spotbugs.github.io 에서 찾았습니다 .
Amedee Van Gasse

1

여기에 다른 답변이 유효하지만이를 해결하기위한 완벽한 조리법은 아닙니다.

완전성의 정신에서 :

pom 파일에 findbugs 주석이 있어야합니다. 컴파일 시간 일 뿐이므로 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 : //.com/a/14509697/1356953

이 기능은 작동 java.lang.SuppressWarnings하므로 별도의 주석을 사용할 필요가 없습니다.

필드의 @SuppressWarnings는 해당 필드와 관련된 모든 경고가 아니라 해당 필드 선언에 대해보고 된 findbugs 경고 만 억제합니다.

예를 들어 "필드 만 null로 설정"경고가 표시되지 않습니다.

@SuppressWarnings ( "UWF_NULL_FIELD") 문자열 s = null; 나는 당신이 할 수있는 최선의 방법은 경고가있는 코드를 가능한 가장 작은 방법으로 분리 한 다음 전체 방법의 경고를 억제하는 것입니다.


8
java.lang.SuppressWarnings작동하지 않습니다. 소스 보존이 있으므로 찾기 버그에는 보이지 않습니다.
Philip Aston
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.