이러한 경우에 버그 보고서를 제기하면 실제로 큰 소음이 발생합니다. 완벽하게 올바른 코드에서 수천 개의 관련없는 버그 메시지가 발생합니다. 사실 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을 전달할 수있는 경우 호출 사이트에서이를 감지 할 수 있습니다.
아, 설명해 주셔서 감사합니다.이 같은 것을 이해하지 못했습니다. – Kiva