FindBugsのバグパターン一覧

Javaに対する静的解析ツールには、以下のようなものがあります。


近頃の動向を見ていると、OSSのツールでは、FindBugsデファクトスタンダードになりつつあるように思います。FindBugsは、2007/11/08にリリースされた1.3.0以降、1〜2ヶ月に一度の頻度でリリースされており、チェックルールも充実してきています。最近、FindBugsのチェックルールを調べる機会があったので、どんなルールがあるのかをまとめてみました。


FindBugsが検出するバグパターンは、次のような括り方となります。

バグカテゴリ > バグコード > バグタイプ


左側がより大きい括りになっており、バグタイプが1つの検出ルールに対応付きます。


FindBugsは、1.3.4時点で、8個のカテゴリと354個のチェックルールから成り立ちますが、以下に、そのバグの一覧を示します。

バグカテゴリ

バグカテゴリ バグカテゴリ(日本語訳) 説明
CORRECTNESS 正確性 バグの可能性 - 明らかなコーディングミスによって、開発者の意図しないコードになっている。誤検出は最小限に留めなければならない。
SECURITY セキュリティ リモートから悪用可能なセキュリティ上の脆弱性に繋がる、信頼されていない入力方法。
BAD_PRACTICE 良くない習慣 推奨される、あるいは本質的なコーディング規範からの逸脱。例えば、hashCodeとequalsの問題、cloneableイディオム、例外の無視、直列化の問題、finalizeの誤用といったもの。開発グループによっては、これらの幾つかの規範を気にとめないかもしれないが、できる限り正確な解析を行う必要がある。
STYLE 回避可能 誤解を与え易いコード、変則的、間違いを招き易いコード。例えば不要なローカル変数への格納、switchのフォールスルー、確認されていないキャスト、nullであることが明らかな値に対する冗長なnullチェックなど。幾らかの誤検出が許容される。以前のバージョンのFindBugsではStyleカテゴリに属していたもの。
PERFORMANCE 実行効率 必ずしも間違いではないが、実行効率が悪くなる可能性のあるもの。
MALICIOUS_CODE 脆弱性を持つコード 信頼されていないコードからの攻撃に対して脆弱性を持つコード。
MT_CORRECTNESS マルチスレッド環境での正確性 スレッド、ロック、volatileの扱いに対するコードの欠陥。
I18N 国際化 国際化、ロカールの扱いに対するコードの欠陥。

バグタイプ一覧

正確性
バグコード バグタイプ メッセージ
IL IL_INFINITE_LOOP 明かな無限ループ。
IL IL_INFINITE_RECURSIVE_LOOP 明らかな無限再帰ループ。
IL IL_CONTAINER_ADDED_TO_ITSELF コンテナへの自分自身の格納。
FL FL_MATH_USING_FLOAT_PRECISION このメソッドはfloatの精度で演算を行っています。
JCIP JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS イミュータブルクラスのフィールドはfinal宣言すべきです。
Dm DMI_ANNOTATION_IS_NOT_VISIBLE_TO_REFLECTION デフォルトのretentionレベルのアノテーションの有無をリフレクションで確認することはできません。
Bx BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR Primitive value is unboxed and coerced for ternary operator
RV RV_01_TO_INT 0から1の乱数値は整数では0に丸められます。
Eq EQ_DONT_DEFINE_EQUALS_FOR_ENUM タイプセーフenumに共変な equals() メソッドが定義されています。
Eq EQ_SELF_USE_OBJECT 共変な equals() メソッドが定義されていますが、Object.equals(Object) が、そのまま継承されています。
Eq EQ_OTHER_USE_OBJECT equals() method defined that doesn't override Object.equals(Object)
Eq EQ_OTHER_NO_OBJECT equals() method defined that doesn't override equals(Object)
Eq EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC equals method overrides equals in superclass and may not be symmetric
Eq EQ_GETCLASS_AND_CLASS_CONSTANT equals method fails for subtypes
Eq EQ_COMPARING_CLASS_NAMES equals method compares class names rather than class objects
Eq EQ_ALWAYS_TRUE equals method always returns true
Eq EQ_ALWAYS_FALSE equals method always returns false
NP NP_ARGUMENT_MIGHT_BE_NULL メソッドで引数のnullチェックが行われていません。
HE HE_USE_OF_UNHASHABLE_CLASS hashCode()を持たないクラスをハッシュで使用しています。
UR UR_UNINIT_READ コンストラクタで初期化前のフィールドを読んでいます。
Nm NM_VERY_CONFUSING メソッドの命名が大変まぎらわしいです。
Nm NM_WRONG_PACKAGE Method doesn't override method in superclass due to wrong package for parameter
Nm NM_METHOD_CONSTRUCTOR_CONFUSION 明らかなメソッドとコンストラクタの間違え。
Nm NM_LCASE_HASHCODE クラスで hashcode() を宣言しています。これは hashCode() であるべきではありませんか?
Nm NM_LCASE_TOSTRING クラスで tostring() を宣言しています。これは toString() であるべきではありませんか?
Nm NM_BAD_EQUAL クラスは、equal()を定義していますが、equals()の間違いではないですか?
Se SE_READ_RESOLVE_IS_STATIC The readResolve method must not be declared as a static method.
SF SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH switchのフォールスルーによって、代入が無駄になっています。
UwF UWF_NULL_FIELD このフィールドはnullに設定されるだけです。
UwF UWF_UNWRITTEN_FIELD 書かれないフィールドがあります。
NP NP_UNWRITTEN_FIELD 書き込まれていないフィールドの読み出し。
RV RV_RETURN_VALUE_IGNORED メソッドにおいて戻り値を無視しています。
RV RV_EXCEPTION_NOT_THROWN Exception created and dropped rather than thrown
RV RV_RETURN_VALUE_IGNORED2 戻り値を無視しているメソッド呼び出し。
NP NP_ALWAYS_NULL nullポインタを参照外しをしています。
NP NP_STORE_INTO_NONNULL_FIELD NonNullアノテーションのついたフィールドにnullを格納しています。
NP NP_ALWAYS_NULL_EXCEPTION メソッドの例外経路において、nullポインタの参照外しをしています。
NP NP_NULL_ON_SOME_PATH nullポインタの参照外しをしている可能性があります。
NP NP_NULL_ON_SOME_PATH_EXCEPTION 例外経路においてnullポインタの参照外しをしている可能性があります。
NP NP_NULL_PARAM_DEREF_NONVIRTUAL 無条件に引数の参照外しを行なう仮想メソッドにnullを渡しています。
NP NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS 無条件に引数の参照外しを行うメソッドにnullを渡しています。
NP NP_NULL_PARAM_DEREF メソッド内で無条件に参照外しされる引数へのnullの引き渡し。
NP NP_NONNULL_PARAM_VIOLATION メソッド呼び出しで非null引数にnullを渡しています。
NP NP_NONNULL_RETURN_VIOLATION このメソッドはnullを返すかもしれないのに@NonNull宣言されています。
NP NP_GUARANTEED_DEREF Nullの参照外し。
NP NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH この値はnullであり、例外経路で必ず参照外しされます。
UCF UCF_USELESS_CONTROL_FLOW_NEXT_LINE 次の行へ移るだけの不要な制御フロー。
RCN RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE すでに参照外しされているのにnullチェックしています。
EC EC_UNRELATED_TYPES_USING_POINTER_EQUALITY Using pointer equality to compare different types
EC EC_UNRELATED_TYPES 違う型のオブジェクトを比較するのにequals()を使用しています。
EC EC_UNRELATED_INTERFACES 違う型のオブジェクトをequals()で比較しています。
EC EC_UNRELATED_CLASS_AND_INTERFACE 関係の無いクラスとインターフェースをequals()で比較しています。
EC EC_NULL_ARG equals()の引数にnullを渡しています。
SA SA_FIELD_SELF_ASSIGNMENT フィールドの自己代入があります。
SA SA_FIELD_DOUBLE_ASSIGNMENT フィールドへの二重代入。
SA SA_LOCAL_DOUBLE_ASSIGNMENT ローカル変数への二重代入。
SA SA_FIELD_SELF_COMPUTATION フィールドを含んだ、無意味な自己演算(例:x & x)。
SA SA_LOCAL_SELF_COMPUTATION 変数を含んだ、無意味な自己演算(例:x & x)。
SA SA_FIELD_SELF_COMPARISON フィールドとそれ自身との自己比較。
SA SA_LOCAL_SELF_COMPARISON 変数とそれ自身との自己比較。
DMI DMI_LONG_BITS_TO_DOUBLE_INVOKED_ON_INT Double.longBitsToDoubleがintに対して呼び出されています。
RV RV_ABSOLUTE_VALUE_OF_RANDOM_INT 不適切な符号付き32-bit整数の乱数の絶対値計算。
RV RV_ABSOLUTE_VALUE_OF_HASHCODE 不適切な符号付き32-bit整数のハッシュコードの絶対値計算。
INT INT_BAD_COMPARISON_WITH_NONNEGATIVE_VALUE 負にはならない値を、負の定数と比較しています。
INT INT_BAD_COMPARISON_WITH_SIGNED_BYTE 符号付きbyteの間違った比較。
INT INT_BAD_REM_BY_1 整数を1で割った剰余の計算。
BIT BIT_IOR_OF_SIGNED_BYTE 符号付きbyte値に対するビット論理和演算の実行。
BIT BIT_AND 互換性のないビットマスク。
BIT BIT_SIGNED_CHECK_HIGH_BIT Check for sign of bitwise operation
BIT BIT_AND_ZZ ((...) & 0) == 0の判定。
BIT BIT_IOR 互換性のないビットマスク。
UMAC UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS 匿名クラスに呼び出せないクラスが宣言されています。
IJU IJU_ASSERT_METHOD_INVOKED_FROM_RUN_METHOD runメソッドにおけるJUnitアサーション
IJU IJU_SETUP_NO_SUPER TestCase は setUp を定義していますが、super.setUp()を呼び出していません。
IJU IJU_TEARDOWN_NO_SUPER TestCase は tearDown を定義していますが、super.tearDown()を呼び出していません。
IJU IJU_SUITE_NOT_STATIC TestCaseが非staticなsuiteメソッドを定義しています。
IJU IJU_BAD_SUITE_METHOD TestCaseが間違ったsuiteメソッドを宣言しています。
IJU IJU_NO_TESTS テストを持たないTestCase。
BOA BOA_BADLY_OVERRIDDEN_ADAPTER 親のアダプタクラスのメソッドを不適切にオーバーライドしています。
SQL BRSA_BAD_RESULTSET_ACCESS このメソッドは、ResultSetのインデックス0のフィールドにアクセスしようとしています。
SQL SQL_BAD_RESULTSET_ACCESS リザルトセットの添字0にアクセスしようとしています。
SQL SQL_BAD_PREPARED_STATEMENT_ACCESS PreparedStatementのパラメータに添字0を指定しています。
SIO SIO_SUPERFLUOUS_INSTANCEOF instanceof演算子で型チェックをする必要はありません。
BAC BAC_BAD_APPLET_CONSTRUCTOR 未初期化状態のAppletStubに依存した間違ったアプレットコンストラクタ
EC EC_ARRAY_AND_NONARRAY 配列オブジェクトと非配列オブジェクトのequals()による比較。
EC EC_BAD_ARRAY_COMPARE 配列オブジェクトのequals呼び出しは、==と等価です。
STI STI_INTERRUPTED_ON_CURRENTTHREAD interrupted()を呼び出すために無駄なcurrentThread()呼び出しを行なっています。
STI STI_INTERRUPTED_ON_UNKNOWNTHREAD staticメソッドThread.interrupted()がスレッドインスタンスに対して呼び出されています。
IP IP_PARAMETER_IS_DEAD_BUT_OVERWRITTEN パラメータへの変更内容は、上書きではなく単に捨てられます。
DLS DLS_DEAD_LOCAL_STORE_IN_RETURN Useless assignment in return statement
DLS DLS_DEAD_STORE_OF_CLASS_LITERAL Dead store of class literal
MF MF_METHOD_MASKS_FIELD フィールドと同名のローカル変数を定義しています。
MF MF_CLASS_MASKS_FIELD 親クラスで定義されたフィールドと同名のフィールドを定義しています。
FE FE_TEST_IF_EQUAL_TO_NOT_A_NUMBER NaNとの無効な比較。
ICAST ICAST_INT_CAST_TO_FLOAT_PASSED_TO_ROUND intがfloatにキャストされてから、Math.roundに渡されています。
ICAST ICAST_INT_CAST_TO_DOUBLE_PASSED_TO_CEIL intのdoubleへのキャスト後のMath.ceilへの引き渡し。
VA VA_FORMAT_STRING_ARG_MISMATCH Number of format-string arguments does not correspond to number of placeholders
VA VA_PRIMITIVE_ARRAY_PASSED_TO_OBJECT_VARARG 可変引数をとるメソッドへのプリミティブ型の配列の引き渡し。
BC BC_IMPOSSIBLE_CAST_PRIMITIVE_ARRAY プリミティブ型の配列を含んだ不可能なキャスト。
BC BC_IMPOSSIBLE_CAST 不可能なキャスト。
NP NP_NULL_INSTANCEOF nullと分かっている値をinstanceofで型チェックしています。
NP BC_NULL_INSTANCEOF nullと分かっている値をinstanceofで型チェックしています。
BC BC_IMPOSSIBLE_INSTANCEOF 常にfalseを返すinstanceof。
RE RE_POSSIBLE_UNINTENDED_PATTERN "."は正規表現です。
RE RE_BAD_SYNTAX_FOR_REGULAR_EXPRESSION 正規表現の文法ミス。
RE RE_CANT_USE_FILE_SEPARATOR_AS_REGULAR_EXPRESSION File.separatorが正規表現で使用されています。
DLS DLS_OVERWRITTEN_INCREMENT インクリメントの上書き。
ICAST ICAST_BAD_SHIFT_AMOUNT 0から31をこえるint値のビットシフト。
IM IM_MULTIPLYING_RESULT_OF_IREM 整数の剰余結果への整数乗算の実行。
DMI DMI_INVOKING_TOSTRING_ON_ARRAY 配列に対するtoStringメソッド呼び出し。
DMI DMI_INVOKING_TOSTRING_ON_ANONYMOUS_ARRAY Invocation of toString on an array
DMI DMI_BAD_MONTH 不正な月定数。
DMI DMI_CALLING_NEXT_FROM_HASNEXT hasNextメソッドの中でnextメソッドを呼び出し。
QBA QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT boolean式でのboolean直定数の代入。
VR VR_UNRESOLVABLE_REFERENCE 解決できないクラス、メソッドへの参照の生成。
GC GC_UNRELATED_TYPES 型パラメータとメソッド引数の型に互換性がありません。
TQ TQ_ALWAYS_VALUE_USED_WHERE_NEVER_REQUIRED Value annotated as carrying a type qualifier used where a value that must not carry that qualifier is required
TQ TQ_NEVER_VALUE_USED_WHERE_ALWAYS_REQUIRED Value annotated as never carrying a type qualifier used where value carrying that qualifier is required
TQ TQ_MAYBE_SOURCE_VALUE_REACHES_ALWAYS_SINK Value that might not carry a type qualifier reaches a use requiring that type qualifier
TQ TQ_MAYBE_SOURCE_VALUE_REACHES_NEVER_SINK Unknown value reaches a use which forbids values carrying type qualifier annotation
IO IO_APPENDING_TO_OBJECT_OUTPUT_STREAM Doomed attempt to append to an object output stream
セキュリティ
バグコード バグタイプ メッセージ
Dm DMI_EMPTY_DB_PASSWORD Empty database password
Dm DMI_CONSTANT_DB_PASSWORD Hardcoded constant database password
HRS HRS_REQUEST_PARAMETER_TO_COOKIE HTTP cookie formed from untrusted input
HRS HRS_REQUEST_PARAMETER_TO_HTTP_HEADER HTTP Response splitting vulnerability
XSS XSS_REQUEST_PARAMETER_TO_SERVLET_WRITER Servlet reflected cross site scripting vulnerability
XSS XSS_REQUEST_PARAMETER_TO_SEND_ERROR Servlet reflected cross site scripting vulnerability
XSS XSS_REQUEST_PARAMETER_TO_JSP_WRITER JSP reflected cross site scripting vulnerability
SQL SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE SQLのStatementオブジェクトのexecuteメソッドに定数でない文字列が渡されています。
SQL SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING PreparedStatementが定数でないStringから生成されています。
良くない習慣
バグコード バグタイプ メッセージ
SW SW_SWING_METHODS_INVOKED_IN_SWING_THREAD ある種のSwingのメソッドは、awtイベントディスパッチスレッドから呼び出す必要があります。
UI UI_INHERITANCE_UNSAFE_GETRESOURCE クラスが継承されている場合GetResourceの呼び出しは安全ではありません。
NP NP_BOOLEAN_RETURN_NULL Method with Boolean return type returns explicit null
AM AM_CREATES_EMPTY_ZIP_FILE_ENTRY 空のzipファイルエントリを作成しています。
AM AM_CREATES_EMPTY_JAR_FILE_ENTRY 空のjarファイルエントリを作成しています。
IMSE IMSE_DONT_CATCH_IMSE IllegalMonitorStateException の疑わしいキャッチ。
CN CN_IDIOM クラスは、Cloneable を実装していますが、clone メソッドを定義していないか使用しません。
CN CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE Class defines clone() but doesn't implement Cloneable
CN CN_IDIOM_NO_SUPER_CALL clone()メソッドがsuper.clone()を呼び出していません。
Nm NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER Use of identifier that is a keyword in later versions of Java
Nm NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER Use of identifier that is a keyword in later versions of Java
DE DE_MIGHT_DROP メソッドで例外を落としている可能性があります。
DE DE_MIGHT_IGNORE メソッドで例外を無視している可能性があります。
DP DP_DO_INSIDE_DO_PRIVILEGED doPrivilegedブロックの中で呼び出さなければならないメソッドが呼び出されています。
DP DP_DO_INSIDE_DO_PRIVILEDGED クラスローダはdoPrivilegedブロックの中でのみ作成可能です。
DP DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED クラスローダはdoPrivilegedブロックの中でのみ作成可能です。
DP DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEDGED クラスローダはdoPrivilegedブロックの中でのみ作成可能です。
Dm DM_EXIT System.exit(...)を呼び出しています。
Dm DM_RUN_FINALIZERS_ON_EXIT 危険なrunFinalizersOnExitメソッドの呼び出し。
FI FI_FINALIZER_NULLS_FIELDS Finalizer nulls fields
FI FI_FINALIZER_ONLY_NULLS_FIELDS Finalizer only nulls fields
FI FI_EMPTY 空の finalizer は削除されるべきです。
FI FI_NULLIFY_SUPER finalizerはスーパークラスの finalizer を無視しています。
FI FI_USELESS finalizerは単にスーパークラスのfinalizerを呼び出しているに過ぎません。
FI FI_MISSING_SUPER_CALL finalizerにスーパークラスのfinalizerの呼び出しの記述がありません。
FI FI_EXPLICIT_INVOCATION finalizer を明示的に呼び出しています。
Eq EQ_SELF_NO_OBJECT 共変な equals() メソッドを定義しています。
NP NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT equals() メソッドでnull引数をチェックしていません。
NP NP_DOES_NOT_HANDLE_NULL equals() メソッドがnull引数をチェックしていません。
Co CO_SELF_NO_OBJECT 共変な compareTo() メソッドが定義されています。
HE HE_HASHCODE_USE_OBJECT_EQUALS クラスで hashCode() を定義していますが、 Object.equals() はそのまま使っています。
Eq EQ_COMPARETO_USE_OBJECT_EQUALS compareTo(...)を宣言し、Object.equals()を使用しています。
HE HE_HASHCODE_NO_EQUALS クラスで hashCode() を定義していますが、equals() は定義していません。
HE HE_EQUALS_USE_HASHCODE クラスで equals() を定義していますが、Object.hashCode() はそのまま使っています。
HE HE_INHERITS_EQUALS_USE_HASHCODE クラスは、equals()を継承し、Object.hashCode()をそのまま使用しています。
HE HE_EQUALS_NO_HASHCODE クラスで equals() を定義していますが hashCode() は定義していません。
Eq EQ_ABSTRACT_SELF 抽象クラスで共変な equals() メソッドを宣言しています。
ES ES_COMPARING_STRINGS_WITH_EQ 文字列を == や != を用いて比較しています。
ES ES_COMPARING_PARAMETER_STRING_WITH_EQ 文字列引数の ==、!=による比較。
Co CO_ABSTRACT_SELF 抽象クラスで共変な compareTo() メソッドを宣言しています。
IC IC_SUPERCLASS_USES_SUBCLASS_DURING_INITIALIZATION 親クラスが初期化の際に子クラスを使用しています。
It IT_NO_SUCH_ELEMENT iterator の next() メソッドが NoSuchElement 例外をthrowすることができません。
Nm NM_SAME_SIMPLE_NAME_AS_SUPERCLASS Class names shouldn't shadow simple name of superclass
Nm NM_SAME_SIMPLE_NAME_AS_INTERFACE Class names shouldn't shadow simple name of implemented interface
Nm NM_CLASS_NAMING_CONVENTION クラス名は大文字で始めるべきです。
Nm NM_METHOD_NAMING_CONVENTION メソッド名は、小文字で始めるべきです。
Nm NM_FIELD_NAMING_CONVENTION フィールド名は、小文字で始めるべきです。
Nm NM_VERY_CONFUSING_INTENTIONAL まぎらわしい命名 (意図的)
Nm NM_WRONG_PACKAGE_INTENTIONAL Method doesn't override method in superclass due to wrong package for parameter
Nm NM_CONFUSING メソッド名がまぎらわしいです。
Nm NM_CLASS_NOT_EXCEPTION 例外クラスのような名前を持った、非例外クラス。
RR RR_NOT_CHECKED メソッドは InputStream.read() の戻り値を無視しています。
RR SR_NOT_CHECKED このメソッドで、InputStream.skip()の戻り値を無視しています。
Se SE_READ_RESOLVE_MUST_RETURN_OBJECT readResolveメソッドの戻り値の型は、Objectでなければなりません。
Se SE_TRANSIENT_FIELD_NOT_RESTORED 直列化復元の際に設定されないtransientフィールドがあります。
Se SE_METHOD_MUST_BE_PRIVATE 直列化のためには、メソッドをprivate宣言しなければなりません。
Se SE_NO_SUITABLE_CONSTRUCTOR_FOR_EXTERNALIZATION クラスはExternalizableを実装していますが、引数無しコンストラクタを定義していません。
Se SE_NO_SUITABLE_CONSTRUCTOR このクラスはSerializableを実装していますが、親クラスが引数無しコンストラクタを定義していません。
SnVI SE_NO_SERIALVERSIONID クラスは直列化可能です。しかし serialVersionUID を宣言していません。
Se SE_COMPARATOR_SHOULD_BE_SERIALIZABLE Serializableを実装していないComparator。
Se SE_NONSTATIC_SERIALVERSIONID serialVersionUID が static ではありません。
Se SE_NONFINAL_SERIALVERSIONID serialVersionUID が final ではありません。
Se SE_NONLONG_SERIALVERSIONID serialVersionUID が long ではありません。
Se SE_BAD_FIELD 直列化可能なクラスのインスタンスフィールドが、非transientで、非直列化可能です。
Se SE_BAD_FIELD_INNER_CLASS 直列化可能でないクラスが、直列化可能なインナークラスを持っています。
Se SE_INNER_CLASS 直列化可能なインナークラス
Se SE_BAD_FIELD_STORE 直列化出来ない値が、直列化可能と宣言されたクラスのインスタンスフィールドに格納されています。
RV RV_RETURN_VALUE_IGNORED_BAD_PRACTICE Method ignores exceptional return value
NP NP_CLONE_COULD_RETURN_NULL clone()がnullを返す可能性があります。
NP NP_TOSTRING_COULD_RETURN_NULL toStringメソッドがnullを返す可能性があります。
SI SI_INSTANCE_BEFORE_FINALS_ASSIGNED 全てのstatic finalフィールドが割り当てられる前に、static初期化子がインスタンス生成をおこなっています。
OS OS_OPEN_STREAM メソッドでストリームのクローズに失敗する可能性があります。
OS OS_OPEN_STREAM_EXCEPTION_PATH 例外発生時にストリームのクローズに失敗するかもしれません。
RC RC_REF_COMPARISON 疑わしい参照の比較です。
BC DMI_RANDOM_USED_ONLY_ONCE Randomオブジェクトが生成され、たった1回だけ使用されています。
BIT BIT_SIGNED_CHECK Check for sign of bitwise operation
ODR ODR_OPEN_DATABASE_RESOURCE メソッドは、データベースリソースの解放に失敗するかもしれません。
ODR ODR_OPEN_DATABASE_RESOURCE_EXCEPTION_PATH メソッドは、例外が起きた時にデータベースリソースの解放に失敗するかもしれません。
ISC ISC_INSTANTIATE_STATIC_CLASS staticメソッドしか提供していないクラスのインスタンスを無駄に生成しています。
J2EE J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION HttpSessionへの直列化できないオブジェクトの格納。
BC BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS equalsメソッドは引数の型を仮定してはいけません。
回避可能
バグコード バグタイプ メッセージ
SKIPPED SKIPPED_CLASS_TOO_BIG Class too big for analysis
Dm DMI_THREAD_PASSED_WHERE_RUNNABLE_EXPECTED Runnableが期待されるところにThreadを渡しています。
Eq EQ_DOESNT_OVERRIDE_EQUALS Class doesn't override equals in superclass
Eq EQ_UNUSUAL Unusual equals method
NS NS_DANGEROUS_NON_SHORT_CIRCUIT 潜在的な非短絡論理の危険な使用。
NS NS_NON_SHORT_CIRCUIT 非短絡的ロジックの疑わしい使用。
IC IC_INIT_CIRCULARITY 初期化がループしています。
IA IA_AMBIGUOUS_INVOCATION_OF_INHERITED_OR_OUTER_METHOD 呼び出されているメソッドは、継承されたものなのか外部のものなのか、あいまいです。
Se SE_PRIVATE_READ_RESOLVE_NOT_INHERITED private readResolve method not inherited by subclasses
Se SE_TRANSIENT_FIELD_OF_NONSERIALIZABLE_CLASS transientフィールドを持つクラスが直列化可能になっていません。
SF SF_SWITCH_FALLTHROUGH breakしないcaseが、switch文の中にあります。
QF QF_QUESTIONABLE_FOR_LOOP forループにおける複雑で難解なインクリメント。
ST ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD 非スタティックメソッドからのスタティックフィールドへの書き込み。
NP NP_LOAD_OF_KNOWN_NULL_VALUE nullと分かっている値のロード。
NP NP_IMMEDIATE_DEREFERENCE_OF_READLINE readLine()の結果に対する即座の参照外し。
NP NP_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR コンストラクタで初期化されていないフィールドの読み出し。
UwF UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR フィールドがコンストラクタで初期化されていません。
RV RV_CHECK_FOR_POSITIVE_INDEXOF String.indexOfの結果の正かどうかのチェック。
RV RV_DONT_JUST_NULL_CHECK_READLINE readLine()の結果がnullで無いことをチェックした後の破棄。
NP NP_NULL_ON_SOME_PATH_MIGHT_BE_INFEASIBLE Possible null pointer dereference on path that might be infeasible
NP NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE メソッドの戻り値が原因でnullとなっている可能性のある参照の参照外し。
PZLA PZLA_PREFER_ZERO_LENGTH_ARRAYS 戻り値としてnullよりむしろ長さ0の配列を返すことを検討すべきです。
UCF UCF_USELESS_CONTROL_FLOW 利用されないフロー制御ステートメントがあります。
RCN RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE nullであることが明らかな参照の無駄なnullチェック。
RCN RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE nullでないことが明らかな参照の無駄なnullチェック。
RCN RCN_REDUNDANT_COMPARISON_TWO_NULL_VALUES 2つのnull参照を無駄に比較しています。
RCN RCN_REDUNDANT_COMPARISON_OF_NULL_AND_NONNULL_VALUE 非null参照を無駄にnullと比較しています。
SA SA_LOCAL_SELF_ASSIGNMENT ローカル変数の自己代入があります。
RV RV_REM_OF_RANDOM_INT 符号付き32bit整数の乱数の剰余計算。
RV RV_REM_OF_HASHCODE ハッシュコードの剰余は負になる場合があります。
INT INT_VACUOUS_COMPARISON 無意味な整数比較。
UOE UOE_USE_OBJECT_EQUALS Objectのequalsメソッドをオーバーライドしていないfinalクラスのequalsメソッドを呼び出しています。
DLS DLS_DEAD_LOCAL_STORE ローカル変数への意味の無い代入。
DLS DLS_DEAD_LOCAL_STORE_OF_NULL ローカル変数への無駄なnull代入。
REC REC_CATCH_EXCEPTION Exceptionが発生しないのにExceptionをキャッチしています。
FE FE_FLOATING_POINT_EQUALITY 浮動小数の同値比較。
CD CD_CIRCULAR_DEPENDENCY クラス間の循環依存関係。
RI RI_REDUNDANT_INTERFACES 親クラスが実装しているインターフェースをもう一度実装宣言しています。
MTIA MTIA_SUSPECT_STRUTS_INSTANCE_FIELD Struts Actionの継承クラスでのインスタンスフィールドの使用。
MTIA MTIA_SUSPECT_SERVLET_INSTANCE_FIELD Servletクラスを継承しているクラスでのインスタンスフィールドの使用。
PS PS_PUBLIC_SEMAPHORES 同期化とセマフォの公開インターフェースへの暴露。
ICAST ICAST_INTEGER_MULTIPLY_CAST_TO_LONG intの乗算結果をlongにキャストしています。
ICAST ICAST_IDIV_CAST_TO_DOUBLE intの除算結果のdoubleへのキャスト。
DMI DMI_NONSERIALIZABLE_OBJECT_WRITTEN 直列化できないオブジェクトのObjectOutputへの書き込み。
BC BC_BAD_CAST_TO_ABSTRACT_COLLECTION 抽象コレクション型への疑わしいキャスト。
BC BC_VACUOUS_INSTANCEOF 常にtrueを返すinstanceof。
BC BC_UNCONFIRMED_CAST チェック/確認されていないキャスト。
BC BC_BAD_CAST_TO_CONCRETE_COLLECTION 具象コレクションクラスへの疑わしいキャスト。
ICAST ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT 符号無し右シフトのshort/byteへのキャスト。
IM IM_AVERAGE_COMPUTATION_COULD_OVERFLOW オーバーフローの可能性がある平均値計算。
IM IM_BAD_CHECK_FOR_ODD この奇数判定は、負の数では正しく動作しません。
DMI DMI_HARDCODED_ABSOLUTE_FILENAME 絶対パスのハードコード。
DMI DMI_USELESS_SUBSTRING substring(0)の呼び出しは元と同じ値を返します。
DB DB_DUPLICATE_BRANCHES 両条件でのコードが同一。
DB DB_DUPLICATE_SWITCH_CLAUSES switch文の中に同じコードがあります。
XFB XFB_XML_FACTORY_BYPASS XML関連のインターフェースの実装を直接生成しています。
USM USM_USELESS_SUBCLASS_METHOD 親クラスのメソッドへの不必要な移譲
USM USM_USELESS_ABSTRACT_METHOD インターフェースに定義済みのメソッドの抽象メソッド宣言。
CI CI_CONFUSED_INHERITANCE finalクラスでのprotectedフィールド宣言。
実行効率
バグコード バグタイプ メッセージ
Dm DMI_COLLECTION_OF_URLS URLのMapやSetはパフォーマンスを悪化させます。
Dm DMI_BLOCKING_METHODS_ON_URL URLのequals()、hashCode()は、ブロックされます。
Dm DM_STRING_CTOR メソッドで非効率な new String(String) コンストラクタを呼び出しています。
Dm DM_STRING_VOID_CTOR メソッドで非効率な new String() コンストラクタを呼び出しています。
Dm DM_STRING_TOSTRING StringのtoString()メソッドが呼び出されています。
Dm DM_GC 明示的にガベージコレクションを呼び出しています。ベンチマークのコード以外で記述されるのはきわめて疑わしいです。
Dm DM_BOOLEAN_CTOR メソッドで非効率なBooleanのコンストラクタを呼んでいます。その代わりにBoolean.valueOf(...) を使うべきです。
Bx DM_NUMBER_CTOR 非効率なNumberのコンストラクタが呼び出されています。valueOfスタティックメソッドを代わりに使用してください。
Bx DM_FP_NUMBER_CTOR 非効率な浮動小数点数コンストラクタを呼び出しています。valueOfスタティックメソッドを代わりに使用してください。
Dm DM_STRING_EMPTY_EQUALS メソッドは非効率なString.equals("")呼び出しを行っています。String.length() == 0を替わりに使用してください。
Bx BX_BOXING_IMMEDIATELY_UNBOXED プリミティブ型の値が、ボクシングされた後、すぐにアンボクシングされています。
Bx BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COERCION プリミティブ型の値が、ボクシングされた後に他のプリミティブ型に変換するためにアンボクシングされています。
Bx DM_BOXED_PRIMITIVE_TOSTRING プリミティブ型のラッパクラスのインスタンスがtoStringを呼び出すためだけに生成されています。
Dm DM_NEW_FOR_GETCLASS クラスオブジェクトを得るためだけにインスタンス生成が行なわれています。
Dm DM_NEXTINT_VIA_NEXTDOUBLE 整数の乱数値を得たいのであれば、nextDoubleではなくnextIntメソッドを使用してください。
HSC HSC_HUGE_SHARED_STRING_CONSTANT 複数のクラスに巨大な文字列定数が重複して存在しています。
SS SS_SHOULD_BE_STATIC 読まれないフィールドがあります。このフィールドは static になるべきではないのですか?
UuF UUF_UNUSED_FIELD 利用されないフィールドがあります。
UrF URF_UNREAD_FIELD 読まれないフィールドがあります。
SIC SIC_INNER_SHOULD_BE_STATIC staticな内部クラスになるべきではないのですか?
SIC SIC_INNER_SHOULD_BE_STATIC_ANON 名前付きstatic内部クラスにリファクタリング可能と思われます。
SIC SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS static内部クラスにリファクタリング可能です。
UPM UPM_UNCALLED_PRIVATE_METHOD private メソッドは一度も呼ばれません。
SBSC SBSC_USE_STRINGBUFFER_CONCATENATION このメソッド内で、+を使ってループ内で文字列を連結しています。
ITA ITA_INEFFICIENT_TO_ARRAY このメソッドは、toArray()に長さ0の配列を渡しています。
WMI WMI_WRONG_MAP_ITERATOR entrySetイテレータを使用すべき場所での非効率なkeySetイテレータの使用。
UM UM_UNNECESSARY_MATH 定数に対するMathクラスのstaticメソッド呼び出し。
IMA IMA_INEFFICIENT_MEMBER_ACCESS エンクロージングクラスのprivateフィールドにアクセスしています。
脆弱性を持つコード
バグコード バグタイプ メッセージ
FI FI_PUBLIC_SHOULD_BE_PROTECTED finalizerはprotectedであるべきです。publicであるべきではありません。
MS MS_EXPOSE_REP public static なメソッドで配列を戻り値として返すと、内部表現を暴露してしまう可能性があります。
EI EI_EXPOSE_REP メソッドは変更可能なオブジェクトの参照を返すことにより内部表現を暴露しています。
EI2 EI_EXPOSE_REP2 可変オブジェクトへの参照を自らに格納してしまうことにより内部表現を暴露してしまう可能性があります。
MS EI_EXPOSE_STATIC_REP2 ミュータブルなオブジェクトをstaticフィールドに格納する事で、内部の状態を外部に晒す危険があります。
MS MS_OOI_PKGPROTECT フィールドはinterfaceから取り出してパッケージプライベートにすべきです。
MS MS_FINAL_PKGPROTECT フィールドはfinal 且つ パッケージプライベートにすべきです。
MS MS_SHOULD_BE_FINAL フィールドは final ではありませんが、finalに変更すべきです。
MS MS_PKGPROTECT フィールドはパッケージプライベートにすべきです。
MS MS_MUTABLE_HASHTABLE フィールドは変更可能なHashtableです。
MS MS_MUTABLE_ARRAY フィールドは mutable な配列です。
MS MS_CANNOT_BE_FINAL フィールドはfinalではないため、悪意を持ったコードから保護する事は出来ません。
マルチスレッド環境での正確性
バグコード バグタイプ メッセージ
VO VO_VOLATILE_REFERENCE_TO_ARRAY 配列の参照を格納するフィールドをvolatile宣言しても、配列の各要素はvolatileとしては扱われません。
NP NP_SYNC_AND_NULL_CHECK_FIELD Synchronize and null check on the same field.
Dm DM_MONITOR_WAIT_ON_CONDITION Conditionオブジェクトに対するwait()呼び出し。
Dm DM_USELESS_THREAD 実行する内容を指定せずにThreadオブジェクトを生成しています。
DC DC_DOUBLECHECK フィールドのダブルチェックをおこなっている可能性があります。
IS IS_FIELD_NOT_GUARDED フィールドが同時並行アクセスに対して無防備です。
MSF MSF_MUTABLE_SERVLET_FIELD Mutable servlet field
IS IS2_INCONSISTENT_SYNC 同期化が考慮されていません。
NN NN_NAKED_NOTIFY 裸の notify。
Ru RU_INVOKE_RUN スレッドの中で run を実行しています。(本当は startを代わりに呼び出すべきではないのですか?)。
SP SP_SPIN_ON_FIELD メソッドはフィールドのスピンロックを利用しています。
TLW TLW_TWO_LOCK_WAIT 2つのロックを持ったまま wait しています。
TLW TLW_TWO_LOCK_NOTIFY 2つのロックを保持したままでのnotify。
UW UW_UNCOND_WAIT waitに条件文がありません。
UG UG_SYNC_SET_UNSYNC_GET getメソッドは同期化(synchronized)されていませんが、setメソッド同期化されています。
DL DL_SYNCHRONIZATION_ON_SHARED_CONSTANT Synchronization on interned String could lead to deadlock
DL DL_SYNCHRONIZATION_ON_BOOLEAN Synchronization on Boolean could lead to deadlock
DL DL_SYNCHRONIZATION_ON_UNSHARED_BOXED_PRIMITIVE Synchronization on boxed primative values
DL DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE Synchronization on boxed primative could lead to deadlock
ESync ESync_EMPTY_SYNC 空のsynchronizedブロック。
IS IS_INCONSISTENT_SYNC 同期の取り方に統一感がありません。
ML ML_SYNC_ON_FIELD_TO_GUARD_CHANGING_THAT_FIELD Synchronization on field in futile attempt to guard that field
ML ML_SYNC_ON_UPDATED_FIELD メソッドは更新されるフィールドを使って同期しています。
WS WS_WRITEOBJECT_SYNC クラスの writeObject() メソッドは同期化されています。しかし それ以外のメソッドは同期化されていません。
RS RS_READOBJECT_SYNC クラスの readObject() メソッドは同期化されています。
SC SC_START_IN_CTOR コンストラクタが Thread.start() を実行しています。
Wa WA_NOT_IN_LOOP waitがループの中にありません。
Wa WA_AWAIT_NOT_IN_LOOP Condition.await()がループに囲まれていません。
No NO_NOTIFY_NOT_NOTIFYALL notifyAll() ではなく notify() を使っています。
UL UL_UNRELEASED_LOCK メソッドで全ての経路においてロックが解放されません。
UL UL_UNRELEASED_LOCK_EXCEPTION_PATH メソッドで全ての例外経路においてロックが解放されません。
MWN MWN_MISMATCHED_WAIT 組合せが間違った wait() があります。
MWN MWN_MISMATCHED_NOTIFY 組合せが間違った notify() があります。
LI LI_LAZY_INIT_INSTANCE インスタンスフィールドの不正な遅延初期化がおこなわれています。
LI LI_LAZY_INIT_STATIC staticフィールドの不正な遅延初期化がおこなわれています。
LI LI_LAZY_INIT_UPDATE_STATIC Incorrect lazy initialization and update of static field
JLM JLM_JSR166_LOCK_MONITORENTER java.util.concurrent の Lock による同期がおこなわれます。
SWL SWL_SLEEP_WITH_LOCK_HELD ロックを保持したままでのThread.sleep()の呼び出し。
STCAL STCAL_STATIC_CALENDAR_INSTANCE Static Calendar
STCAL STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE Call to static Calendar
STCAL STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE Static DateFormat
STCAL STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE Call to static DateFormat
WL WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL Sychronization on getClass rather than class literal
国際化
バグコード バグタイプ メッセージ
Dm DM_CONVERT_CASE Localeを引数にとるメソッドの使用を検討してください。