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を引数にとるメソッドの使用を検討してください。 |