2012-06-07 7 views
2

FindBugs를 사용하여 응용 프로그램에 대한 보고서를 만들고 싶습니다.FindBugs가 버그를 찾지 못했습니다.

나는 그것을 실행하고 잠재적 인 버그를 다음과 같이 찾을 수 없습니다 : 개체가 null의 경우

public List<String> getListTrace(A object) { 

    String arg = object.getArg(); 
    ... 
} 

, 내 응용 프로그램이 다운 될 것입니다.

왜 FindBugs가 경고를 발생시키지 않습니까?

답변

0

그 코드에는 버그가있는 것 같지 않습니다.

object이 null인지 확인하기 위해 코드를 변경 한 경우 어떻게 하시겠습니까? 가장 합리적인 조치는 아마도 NullPointerException을 던질 것입니다. 맞습니까?

정확히 코드 스 니펫이 수행하는 작업입니다. 메소드에 액세스 할 때 java가 자동으로 테스트를 수행하도록 허용합니다.

이 함수가 null 포인터를 확인하지 않는다는 것은 버그가 아닙니다. 버그는 누군가가 당신의 함수에 널 포인터를 넘겨주고 NullPointerException을 일으킬 준비가되어 있지 않은 것입니다.

+0

아, 설명해 주셔서 감사합니다.이 같은 것을 이해하지 못했습니다. – Kiva

0

Findbug가 잠재적 인 null 포인터 액세스를 감지 할 수 없습니다. 그러나 이클립스는 환경 설정에서 해당 컴파일러 경고를 활성화하면 잠재적 인 널 포인터 액세스에 대한 경고를 줄 수 있습니다.

+0

예. 통계가 포함 된 보고서에서이 정보를 제공하지 않습니다. – Kiva

+1

가끔씩 아무 말도 할 수 없습니다. 팀의 버그에 대한 보고서를 작성합니다. 나는 정확한 순간에 상황을보고하기 위해 보고서를 작성해야하기 때문에 10 명과 함께 일한다. – Kiva

2

Findbugs는 객체가 null인지 아닌지를 알지 못합니다. 다음을 사용하여 주석하여 말할 수 있습니다

import javax.annotation.Nullable; 
... 
public List<String> getListTrace(@Nullable A object) { 

이것은 Findbugs를 알려줍니다 (그리고 코드를 읽는 사람)가 괜찮는 getListTrace의 인수로 null을 전달 할 수 있습니다. 따라서 Findbugs는 null을 확인하지 않고 객체를 역 참조하는 경우 경고합니다.

0

이러한 경우에 버그 보고서를 제기하면 실제로 큰 소음이 발생합니다. 완벽하게 올바른 코드에서 수천 개의 관련없는 버그 메시지가 발생합니다. 사실 FindBugs는 더 똑똑한 일을합니다. 메서드가 null 체크없이 인수를 역 참조하는 것을 발견하면 내부적으로이 메서드 인수를 @Nonnull으로 표시합니다. 이에 모순되는 특수한 주석 (예 : TimK 답변)이 있으면 경고 메시지가 나타납니다. 그렇지 않으면 FindBugs는 아무도 아마도 null 인수로이 메소드를 사용하지 않는다고 가정한다. 누군가 실제로 이것을하면 콜 사이트에서 해당 경고를 받게됩니다. getListTrace() 방법은 괜찮보기의 FindBugs의 poit에서

import java.util.Collections; 
import java.util.List; 

public class FBNull { 
    static class A { 
     String getArg() { 
      return "str"; 
     } 
    } 

    public static List<String> getListTrace(A object) { 
     String arg = object.getArg(); 
     return Collections.singletonList(arg); 
    } 

    public void callSite(A a) { 
     if (a == null) { 
      System.out.println("a is null"); 
     } 
     System.out.println(getListTrace(a)); // NP_NULL_PARAM_DEREF 
    } 
} 

예를 들면 다음과 같습니다이다. 그러나 callSite 메서드에는 버그가 있습니다. null에 대한 인수를 명시 적으로 점검하므로 응용 프로그램 논리로 인해 널이 될 수 있습니다. 그러나, 나중에 인수를 역 참조하는 getListTrace()으로 전달됩니다.

버그 : 그래서 당신은 getListTrace() 방법 말 내부 버그 경고가 널이 FBNull.callSite(FBNull$A)

이 메서드 호출이 null 이외의 방법 매개 변수에 null 값을 전달에 getListTrace(FBNull$A)의 null 이외의 매개 변수에 전달. 매개 변수가 항상 널이 아니어야하는 매개 변수로 주석을 달았거나 분석이 항상 참조 해제된다는 것을 보여주었습니다.

실제로 null을 전달할 수있는 경우 호출 사이트에서이를 감지 할 수 있습니다.

관련 문제