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

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

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



답변

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


답변

다른 사람들이 언급했듯이 @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


답변

다음은 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 필터 파일을 찾으십시오.


답변

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


답변

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

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


답변

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

완전성의 정신에서 :

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

여기에는 버그 이름 과 스캔을 비활성화하는 이유도 포함됩니다.


답변

나는 이것을 여기에 남겨 둘 것입니다 : https : //.com/a/14509697/1356953

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

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

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

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