5

こんにちは、Findbugs によって NP_GUARANTEED_DEREF の問題があると報告されているコードを入手しました。今私のコードを見て、何が問題なのかよくわかりません。誰でも問題が何であるかを提案できますか?

public void test() {
  String var = "";
  int index = 2;
  if (index == -1) {
    var = String.class.getName();
    if (var.length() == 0) {
      var = null;
    }
  } else {
    var = Integer.class.getName();
    if (var.length() == 0) {
      var = null;
    }
  }
  if (var == null) {// FINBUGS reports on this line NP_GUARANTEED_DEREF
    /*
     * There is a statement or branch that if executed guarantees that a value
     * is null at this point, and that value that is guaranteed to be
     * dereferenced (except on forward paths involving runtime exceptions).
     */
    throw new NullPointerException("NULL");
  }
}

Findbugs のエラーを掘り下げるとvar = null;、バグの原因として 2 つの割り当てが強調表示されますが、その理由はよくわかりません。varオブジェクトに対して実際に何かを行っているわけではなく、Null チェックを行っているだけです。この例は実際の製品コードから取られていますが、エラーを再現するために必要のないものはすべて削除されています。これが誤検知かどうか疑問に思っていること。そうでない場合、適切な修正は何でしょうか。

Findbugs バグの詳細へのリンクは次のとおりです: http://findbugs.sourceforge.net/bugDescriptions.html#NP_GUARANTEED_DEREF

[更新] この問題に関するフィードバックを受け取った後、Sourceforge の Findbugs Bugtracker に誤検知として記録しました。リンクはhttps://sourceforge.net/tracker/?func=detail&aid=3277814&group_id=96405&atid=614693

問題についての会話はそこで続きます。

4

4 に答える 4

5

分かりました。パソコンでも同様の FB 動作を確認できます。確かに奇妙に見えます。面白いことに、バグ マーカーに置き換えるthrow new NullPointerExceptionthrow new RuntimeException消えてしまいます。

今、私は彼らが何を意味しているかを理解していると思います. メッセージの文言は正確ではありませんが、NPE に対して警告しています。彼らは明示的に NPE をスローするのは悪い習慣だと考えていると思います。

于 2011-03-17T07:32:26.740 に答える
3

これは FindBugs のバグです。この問題を問題追跡ページに投稿してください。findbugs.sf.net

于 2011-03-19T05:27:46.263 に答える
2

OK、FindBugsが探しているのは、nullポインター例外につながることが保証されているステートメントまたはブランチです。当初は、null値の間接参照のみを検索していました。後で分析を拡張して処理しました

if (x == null) throw new NullPointerException()

xの明示的な逆参照と同じです。これは主に手続き間の分析を支援するためであり、パラメーターに対して明示的なnullチェックがあるメソッドは、明示的なnullチェックなしでパラメーターを逆参照するメソッドと同じように扱われ、そのようなパラメーターにnull値が渡されたときにエラーを報告します。

したがって、エラーメッセージのテキストの一部を更新する必要があるかもしれませんが、混乱を引き起こす現実的なケースは実際には多くありません。

上記のコードの目的が何であるかはよくわかりません。varにnullを割り当てているポイントで、nullポインター例外がさらに下に明示的にスローされる状況を作成しています。それは本当にあなたが望む行動ですか?

于 2011-04-13T18:30:38.747 に答える
0

ここでエラーメッセージの定義を詳しく見ると、次のように表示されます。

実行された場合、この時点で値が null であることを保証し、その値が逆参照されることが保証されるステートメントまたはブランチがあります (実行時例外を伴うフォワード パスを除く)。

これは、var が null になることを知らせるだけか、実際に何かが findbugs に var が if ステートメント内で参照されていると思わせているためだと思います。

あなたが投稿したコードは問題ないように見えます.varが実際のコードでアクセスされていないことを再確認します.

私が変更する可能性がある唯一のことは、次のように比較を逆に記述することです。

if (null == var)

そうすれば、=/ の1 つを省略しても明らかです。

于 2011-03-16T17:20:34.387 に答える