0

http://findbugs.sourceforge.net/bugDescriptions.htmlからのすべての説明が明確であるとは限りません。確かに、私は実装を学ぶことができますが、誰かが私よりも経験豊富であれば、いくつかの説明と例が素晴らしいでしょう.

  • これが問題になっているときの UI_INHERITANCE_UNSAFE_GETRESOURCE の例はありますか?
  • BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR にも問題はありません。int と float など、一方の型が他方よりも「大きい」場合、結果は float になります。Integer と Float の場合、ラッパーも Float です。それが私が期待していることです。
  • GC_UNRELATED_TYPES は本当にエラーを見つけるのに役立ちますか? 与えられた例をとってFooCollection<String>.
  • HE_SIGNATURE_DECLARES_HASHING_OF_UNHASHABLE_CLASS は、「Foo」がハッシュ可能でないようなものを意味しますbla(Foo f){hashtable.put(f);}か? FingBugs はサブクラスも「見る」のですか?
  • NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH は NP_ALWAYS_NULL_EXCEPTION よりも強い「間違っている」? なぜ 2 つのエラー ケースと NP_NULL_ON_SOME_PATH_EXCEPTION がさらに 1 つあるのですか? 私にとても似ているように聞こえます。
  • SIO_SUPERFLUOUS_INSTANCEOF の例は何ですか? のようなものfoo(String s){if (s intenceof String) ...。これもnullチェックを行いますが、これはここでのテストではありません...
  • NN_NAKED_NOTIFY. 私の意見では、説明は明確ではありません。状態の変更は必要ありません。new Object() を使用して待機して通知する場合、オブジェクトの状態は変更されません。それとも状態はロック状態ですか?理解できません。
  • SP_SPIN_ON_FIELD。コンパイラがこれをループの外に移動するということは本当に起こりますか? Thread の外部からは常に値を変更できるため、これは私には意味がありません。また、変数がvolatileJVM の場合、値をキャッシュできません。では、どういう意味ですか?
  • それは、STCAL_STATIC_CALENDAR_INSTANCE と STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE または STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE/STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE の違いですか?
  • WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL の XXXX.class が getClass() より優れているのはなぜですか? サブクラスから呼び出されたスーパークラスの getClass() は、常にサブクラスから Class オブジェクトを返します。これは良いことだと思います。
  • EQ_UNUSUAL は正確に何をしますか? 引数がクラス自体と同じ型であることを確認する必要がありますが、そうではありませんか?
  • 休憩で困ったことはありませんか?SF_SWITCH_FALLTHROUGH には本当に価値がありますか? 私には強そうです。
  • TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK と TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_NEVER_SINK が何であるかわかりません。
4

1 に答える 1

8

あなたが言及した FindBugs の説明のいくつかについて、私の経験とテストに基づいて、FindBugs のソース コードを調べることなくコメントできます。

  • UI_INHERITANCE_UNSAFE_GETRESOURCE: 相対 URI で使用する場合this.getClass().getResource(...)、その URI は のクラスに関して解決されthisます。サブクラスが別のパッケージに存在し、サブクラスのリソースを取得すると、(サブクラスに対して) 別の場所を見ることになります。getResource()ファイル名のみを含む相対 URI を使用して呼び出すことにより、クラスが同じパッケージに存在することがわかっているリソースを検索する例を知っています。そのクラスがthis.getClass()の代わりに使用されClassName.class、実際のインスタンスがサブクラスの場合、リソースは見つかりません。

  • BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR: これは、やなどのプリミティブな数値型とは対照的に、Integerやなどのボックス化された数値型について説明します。プリミティブの場合、あなたの期待は 正しいです。しかし、ラップされた数値の場合、予期しないことが起こります。のように、オブジェクトが変更されずに返されることを期待していました 。Floatintfloatboolean ? int : floatintfloatboolean ? Integer : FloatIntegerfloatboolean ? (Number)Integer : Float

    boolean b = Boolean.TRUE;
    final Integer i = 123456789;
    final Float f = 1.0f;
    final Number x = b ? i : f;
    System.out.println("wrapped coerced: " + x); // 1.23456792E8
    final Number y = b ? (Number) i : f;
    System.out.println("wrapped uncoerced: " + y); // 123456789
    
  • GC_UNRELATED_TYPES: FindBugs は、Java 1.5 用に生成できなかったいくつかのコレクション メソッドについて認識しています Collection.contains(Object)。ここで、引数の型 Objectは でなければなりません。そうしないと、既存のソース コードが壊れる可能性があるからです。しかし、コレクションのタイプではないオブジェクトは含まれていないことが確実であるためIntegerStringコレクションに を含めることを要求するのはおそらくバグです。

    Collection<String> coll = new ArrayList<String>();
    System.out.println(coll.contains(42));
    
  • HE_SIGNATURE_DECLARES_HASHING_OF_UNHASHABLE_CLASS: ?

  • NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH: ?

  • SIO_SUPERFLUOUS_INSTANCEOF: ?

  • NN_NAKED_NOTIFY: ?

  • SP_SPIN_ON_FIELD: ではないフィールドでスピンする場合volatile、ループを実行するスレッドが同じ結果を生成する限り、JIT は自由にコードを最適化できます (ループから読み取りを移動することによって)。他のスレッドのアクション。だからこそのvolatileキーワードがあります。これが実際にバグにつながる例を私は知りません。

  • STCAL_STATIC_CALENDAR_INSTANCE: ?

  • WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL: FindBugs の例では、メソッドは同期しgetClass()てそのクラスの静的メンバーにアクセスします。サブクラスはサブクラスで同期するため、スーパークラスとサブクラスは異なるモニターで同期するため、同時に同期ブロックに入ることができ、競合状態が発生します。

  • EQ_UNUSUAL: ?

  • SF_SWITCH_FALLTHROUGH: 私は break. 興味深いことに、実行したばかりのテスト ケースでは、この FindBugs メッセージに加えて、メッセージ SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH を受け取りました。

  • TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK: ?

于 2010-04-16T20:21:52.677 に答える