FindBugs を使用して、アプリケーションに関するレポートを作成したいと考えています。
私はそれを実行しましたが、次のような潜在的なバグは見つかりませんでした:
public List<String> getListTrace(A object) {
String arg = object.getArg();
...
}
オブジェクトが null の場合、アプリケーションはダウンします。
FindBugs がアラートを出さないのはなぜですか?
FindBugs を使用して、アプリケーションに関するレポートを作成したいと考えています。
私はそれを実行しましたが、次のような潜在的なバグは見つかりませんでした:
public List<String> getListTrace(A object) {
String arg = object.getArg();
...
}
オブジェクトが null の場合、アプリケーションはダウンします。
FindBugs がアラートを出さないのはなぜですか?
オブジェクトを null にすることが許可されているかどうかは、Findbugs にはわかりません。注釈を使用してそれを伝えることができます:
import javax.annotation.Nullable;
...
public List<String> getListTrace(@Nullable A object) {
これは、getListTrace の引数として null を渡しても問題ないことを Findbugs (およびコードを読んでいる人) に伝えます。そのため、null をチェックせずにオブジェクトを逆参照すると、Findbugs は警告を発します。
このような場合にバグ レポートを提出すると、非常に大きな騒ぎになります。完全に正しいコードで何千もの無関係なバグ メッセージを受け取ることになります。実際、FindBugs はもっと賢いことをします。メソッドが null チェックなしで引数を逆参照していることが判明した場合、このメソッド引数を内部的に としてマークします@Nonnull
。TimK
これと矛盾する明示的な注釈 (回答のように) がある場合は、警告が表示されます。それ以外の場合、FindBugs は、null の可能性がある引数でこのメソッドを使用する人はいないと想定します。誰かが実際にこれを行うと、呼び出しサイトで対応する警告が表示されます。次に例を示します。
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
}
}
FindBugs の観点からは、getListTrace()
方法は問題ありません。ただし、このcallSite
方法にはバグがあります。引数をnull
明示的にチェックするため、アプリケーション ロジックが原因で null になる可能性があります。getListTrace()
ただし、後で引数をすぐに逆参照するに渡されます。getListTrace()
したがって、メソッド内に次のようなバグ警告があります。
getListTrace(FBNull$A)
バグ: inの非 null パラメータに null が渡されましたFBNull.callSite(FBNull$A)
このメソッド呼び出しは、null 以外のメソッド パラメーターに null 値を渡します。パラメーターが常に非 null であるべきパラメーターとして注釈が付けられているか、分析により常に逆参照されることが示されています。
したがって、実際にヌルを渡すことができれば、呼び出しサイトで検出できます。
Findbug は潜在的なヌル ポインター アクセスを検出できません。ただし、環境設定で対応するコンパイラ警告をアクティブにすると、Eclipse は潜在的なヌル ポインター アクセスに関する警告を表示できます。
そのコードにはバグがあるようには見えません。
null かどうかをチェックするようにコードを変更した場合object
、どうしますか? 最も合理的なアクションは、おそらく をスローすることNullPointerException
ですよね?
それはまさにあなたのコード スニペットが行うことです。メソッドにアクセスするときにJavaが自動的にテストを実行できるようにするだけです。
この関数が null ポインターをチェックしないことは、バグではありません。バグは、誰かが null ポインターを関数に渡し、NullPointerException
.