Detectors

This document lists all detectors in SpotBugs.

Standard detectors

These detectors are on by default:

OverridingMethodsMustInvokeSuperDetector

オーバーライドしているメソッドのうち、スーパークラスのメソッドを呼び出すべきものを見つけます。

FindRoughConstants

このディテクタは,ほぼ (しかし,正確ではなく) 同じである Math.PI のような既知の定数を見つけます。

SynchronizeAndNullCheckField

このディテクタは,同期化されたフィールドを null チェックしているコードを探します。

InitializeNonnullFieldsInConstructor

このディテクタは,コンストラクタで書き込まれない非 null フィールドを見つけます。

BooleanReturnNull

このディテクタは,明示的に null 値を返す戻り型が Boolean のメソッドを探します。

OptionalReturnNull

このディテクタは, Optional の戻り型が明示的に null 値を返すメソッドを探します。

ConfusionBetweenInheritedAndOuterMethod

このディテクタは,継承されたメソッドと外部のメソッドとの潜在的混同を探します。

SynchronizationOnSharedBuiltinConstant

このディテクタは,共有された組込み定数 (たとえば, String) の同期化を探します。

NoteUnconditionalParamDerefs

このディテクタは,無条件にパラメータの参照外しが行われるのかを決定するためにアプリケーションのすべてのメソッドを解析します。 この情報は, null 値がメソッドに渡されるかもしれない呼び出し場所を発見するために後の解析パスで使われます。

低速ディテクタです。

SynchronizeOnClassLiteralNotGetClass

このディテクタは,クラスリテラルではなく, getClass メソッドの結果で同期化するコードを探します。

InfiniteRecursiveLoop

このディテクタは,無限再帰ループを探します。

InfiniteLoop

このディテクタは,無限ループを探します。

VolatileUsage

このディテクタは, volatile フィールドの使い方のバグパターンを探します。

InheritanceUnsafeGetResource

このディテクタは,クラスが別のパッケージのクラスによって拡張されるなら,予想外の結果をもたらす可能性がある this.getClass().getResource(...) の使用を探します。

DoInsideDoPrivileged

このディテクタは, doPrivileged ブロックの中で実行すべきコードを探します。

HugeSharedStringConstants

このディテクタは,複数のクラスファイルにわたって複製されている文字列定数を探します。

FinalizerNullsFields

このディテクタは,クラスのフィールドを null にするファイナライザを探します。 どんな方法でもフィールドを null にすることは効果がなく,ガベージコレクタの助けになりません。

MutableEnum

このディテクタは,可変列挙型フィールドを探して警告します。

InconsistentAnnotations

このディテクタは,型修飾子が直接適用されるメソッドパラメータとそれらのメソッドパラメータの使い方との間で矛盾を見つけます。

RepeatedConditionals

このディテクタは, (x == 5 || x == 5) のような繰り返される条件テストを含んでいるコードを探します。

RedundantConditions

このディテクタは,この式 (x >= 10 && x >= 5) の2番目の条件のような役に立たない条件を含んでいるコードを探します.

FormatStringChecker

このディテクタは,間違った書式文字列をチェックします。

LostLoggerDueToWeakReference

このディテクタは,OpenJDK 1.6の下で異なる振る舞いをするコードを探します。OpenJDK 1.6では, Logger を保持するのに弱参照が使われます。

EqualsOperandShouldHaveClassCompatibleWithThis

このディテクタは, equals メソッドを定義しているクラスと互換性がないクラスのインスタンスをオペランドにしてチェックする equals メソッドをチェックします。

CheckImmutableAnnotation

このディテクタは, net.jcip.annotations.Immutable または javax.annotation.concurrent.Immutable というアノテーションが付けられたクラスのルール違反を探します。

DontCatchIllegalMonitorStateException

このディテクタは, IllegalMonitorStateException をキャッチする try-catch ブロックを探します。

CloneIdiom

このディテクタは, Cloneable クラスを書くためのイディオムの違反を探します。

ComparatorIdiom

このディテクタは, Comparator を実装するクラスを書くためのイディオムの違反を探します。

FindFieldSelfAssignment

このディテクタは,フィールドが同じフィールドの値を読み出して代入される場所を探します。

FindSelfComparison

このディテクタは,値がそれ自身と比較される場所を探します。

FindSelfComparison2

このディテクタは,値がそれ自身と比較される場所を探します。

DroppedException

このディテクタは,例外をキャッチしていますが,何もしていないコードを探します。

LoadOfKnownNullValue

このディテクタは, null とわかっている値の読み出しを探します。

DumbMethodInvocations

このディテクタは,メソッド (例:substring(0)) に渡されている間違った引数を探します。

URLProblems

java.net.URLequalshashCode メソッドはドメイン名の解決をします。 その結果,これらの操作はかなり高くつきます。このディテクタは,メソッドが呼び出されるかもしれない場所を探します。

DumbMethods

このディテクタは,引数のない String コンストラクタのような無意味なメソッドの呼び出しを探します。

NumberConstructor

このディテクタは, Number コンストラクタのプリミティブ型の引数による呼び出しを探します。

FindSqlInjection

このディテクタは, switch 文で定数文字列以外の何かが引数として渡される SQL 文の execute メソッドの呼び出しを探すためにデータフロー解析を使います。

FindDoubleCheck

このディテクタは,ダブルチェックロッキングのインスタンスを探します。

FindFinalizeInvocations

このディテクタは, finalize メソッドの呼び出しと他のファイナライザ関連の問題を探します。

FindHEmismatch

このディテクタは, hashCode メソッドと equals メソッドの定義の問題を探します。

OverridingEqualsNotSymmetrical

このディテクタは,同値関係が対称的ではないかもしれないスーパークラスの equals メソッドをオーバーライドする equals メソッドを探します。

FindNakedNotify

このディテクタは,可変オブジェクトの状態を変更するとは思えない notify メソッドの呼び出しを探します。

FindReturnRef

このディテクタは,可変静的データを返すメソッドを探します。

FindRunInvocations

このディテクタは, Thread.run() の呼び出しを探します。

高速ディテクタです。

SwitchFallthrough

このディテクタは,フォールスルーがある switch 文を探します。

FindSpinLoop

このディテクタは,フィールドからの読み取りをするスピンループを探します。

FindNonShortCircuit

このディテクタは,非短絡論理演算子の疑わしい使用を探します(||&& の代わりに |&)。

FindTwoLockWait

このディテクタは,2つ以上のロックを保持している状態で wait メソッドの呼び出しを探します。

低速ディテクタです。

FindUnconditionalWait

このディテクタは,条件文,またはループの中にない wait メソッドの呼び出しを探します。

FindUninitializedGet

このディテクタは,コンストラクタで初期化されていないフィールドの読み出しを探します。

DontUseEnum

このディテクタは,フィールドとメソッドが J2SE 5.0のキーワードである assertenum を名前として使用していないことをチェックします。

FindUnsyncGet

このディテクタは,set メソッドは同期化していて get メソッドは同期化していない get メソッドと set メソッドを探します。

InitializationChain

このディテクタは,潜在的循環クラス初期化依存関係を探します。

IteratorIdioms

このディテクタは, Iterator クラスの定義方法の問題を探します。

PreferZeroLengthArrays

このディテクタは,配列か明示的に null 参照を返すメソッドを探します。 長さが0の配列を返すことは,このコンテキストにおいて null 参照を返すことよりも一般的に好ましいです。

SynchronizingOnContentsOfFieldToProtectField

このディテクタは,フィールドの更新をガードするためにフィールドを同期化しているように思われるコードを探します。

MutableLock

このディテクタは,変更されたフィールドから読み込まれるオブジェクトの同期化を探します。

FindUselessObjects

このディテクタは役に立たないオブジェクトを探します。

MutableStaticFields

このディテクタは,悪意のあるコードによって変更されるかもしれない static フィールドを探します。

Naming

このディテクタは,疑わしい名前のメソッドを探します。

ReadReturnShouldBeChecked

このディテクタは,戻り値が無視される InputStream.read() または InputStream.skip() の呼び出しを探します。

SerializableIdiom

このディテクタは, Serializable クラスの実装の潜在的な問題を探します。

StartInConstructor

このディテクタは,スレッドを開始するコンストラクタを探します。

FindBadForLoop

このディテクタは,間違った for ループを探します。

ExplicitSerialization

このディテクタは,このクラスが本当に直列化されるという証拠として, readObjectwriteObject による明示的な直列化を探します。

  • :ref:``

UnreadFields

このディテクタは,値が決して読み出されないフィールドを探します。

WaitInLoop

このディテクタは,ループの中にない wait メソッドの呼び出しを探します。

FindComparatorProblems

このディテクタは, Comparator.compare または Comparable.compareTo の実装における問題を探します。

FindNullDeref

このディテクタは, NullPointerException が発生するかもしれない場所を探します。 また, null に対する参照値の冗長な比較を探します。

低速ディテクタです。

FindNullDerefsInvolvingNonShortCircuitEvaluation

このディテクタは, NullPointerException が発生するかもしれない場所を探します。 非短絡評価の使用はありふれたテクニックで失敗の原因になります。

FindOpenStream

このディテクタは,メソッドから脱出しないで,メソッドからのすべての経路でクローズされるように見えない I/O ストリームオブジェクトを探します。

低速ディテクタです。

FindUselessControlFlow

このディテクタは,効果がない制御フロー文を探します。

FindUnreleasedLock

このディテクタは,JSR-166(java.util.concurrent) のロックを獲得したのにメソッドからのすべての経路で解除されないロックを探します。

中速ディテクタです。

補助クラスパスに java.util.concurrent パッケージ (またはパッケージ自体を解析している) が必要であることに注意してこのディテクタを使用してください

FindRefComparison

このディテクタは,2つの参照値を ==!= 演算子で比較している場所を探します。 java.lang.String のような型のクラスの参照値を比較することは一般的に誤りです。

低速ディテクタです。

FindMismatchedWaitOrNotify

このディテクタは,現在ロックされているオブジェクトで作成されるように見えない wait メソッド, notify メソッド, notifyAll メソッドの呼び出しを探します。

中速ディテクタです。

このディテクタは,まだ開発中で,あまりに多くの誤検出が発生するので,無効にされています。

FindEmptySynchronizedBlock

このディテクタは,空の synchronized ブロックを探します。

FindInconsistentSync2

このディテクタは,ロックに関して一貫性のない方法でアクセスされるフィールドを探します。

低速ディテクタです。

FindLocalSelfAssignment2

このディテクタは,ローカル変数の自己代入を探します。

IncompatMask

このディテクタは,疑わしいビット論理式を探します。

LazyInit

このディテクタは,フィールドが volatile ではないフィールドの遅延初期化を探します。

中速ディテクタです。

FindJSR166LockMonitorenter

このディテクタは,JSR-166 のロックで実行される通常の同期化を探します。

中速ディテクタです。

FindUncalledPrivateMethods

このディテクタは,決して呼び出されない private メソッドを探します。

UncallableMethodOfAnonymousClass

このディテクタは,無名内部クラスに定義されたメソッドで,スーパークラスのメソッドをオーバーライドすることを意図していますが,実際はオーバーライドになっていないメソッドを探します。

StringConcatenation

このディテクタは,+を使ったループによる文字列の連結を探します。

InvalidJUnitTest

このディテクタは,不正な形式の JUnit テストを探します。

BadlyOverriddenAdapter

このディテクタは, Adapter クラスを拡張して,間違ったシグネチャで Listener メソッドをオーバーライドするコードを探します。

BadResultSetAccess

このディテクタは,列インデックス番号が0の ResultSetgetXXX または setXXX メソッドの呼び出しを探します。 ResultSet の列インデックス番号は1で始まるので,これは常に間違いです。

SuperfluousInstanceOf

このディテクタは,静的に判定される instanceof 演算子を使用している型チェックを探します。

SuspiciousThreadInterrupted

このディテクタは,非スタティックなコンテキストから Thread.interrupted() の呼び出しを探します。 Thread.currentThread().interrupted() から呼び出されるなら,役に立たない行為なので Thread.interrupted() を使用します。 しかしながら, interrupted メソッドは常にカレントスレッドで呼び出されるので,任意のスレッドオブジェクトで呼び出すのはほぼ間違いなく誤りです。

FindDeadLocalStores

このディテクタは,その後,決して読み出されないローカル変数への代入を探します。

中速ディテクタです。

FindMaskedFields

このディテクタは,メソッドで定義されたローカル変数によって隠されるフィールドを探します。

WrongMapIterator

このディテクタは, keySet イテレータから取り出されたキーを使用して Map エントリの値にアクセスするコードを探します。

InstantiateStaticClass

このディテクタは, static メソッドしか定義していないクラスのオブジェクトを作成しているコードを探します。

RuntimeExceptionCapture

このディテクタは,ブロックの中のコードが例外をスローしないのに例外をキャッチする catch 節を探します。

DontCatchNullPointerException

Nullpointer exceptions should not be caught.

FindFloatEquality

このディテクタは,浮動小数点の等価式を探します。

高速ディテクタです。

FindUnsatisfiedObligation

このディテクタは,メソッドからのすべての経路でクリーンアップされない入出力ストリームとデータベースリソースを探します。

低速ディテクタです。

UnnecessaryMath

このディテクタは,計算結果が静的に知られている値を計算するために java.lang.Mathstatic メソッドを呼び出すコードを探します。 その代わりに定数を使用する方がより高速で,ときにはより正確です。

RedundantInterfaces

このディテクタは,スーパークラスと同じインタフェースを実装すると宣言しているサブクラスを探します。 スーパークラスがインタフェースを実装しているので,サブクラスで同じことをするのは冗長です。

MultithreadedInstanceAccess

このディテクタは,Struts フレームワークを実装する際の潜在的な問題を探します。

BadUseOfReturnValue

このディテクタは,メソッドの戻り値が null ではないことをチェックした後で捨てるケースを探します。

MethodReturnCheck

このディテクタは,戻り値が疑わしく無視されるメソッドの呼び出しを探します。

IDivResultCastToDouble

このディテクタは,整数除算の結果が double にキャストされる場所を探します。 多くの場合,意味されたことは,整数オペランドを double にキャストしてから除算を実行することでした。

FindBadCast2

このディテクタは,データフロー解析を使用してオブジェクト参照の間違ったキャストを探します。

FindUseOfNonSerializableValue

このディテクタは,それらが直列化可能であることを要求するコンテキストで,非 Serializable オブジェクトの使用を探します。

BadSyntaxForRegularExpression

このディテクタは,無効な構文がある正規表現を探します。

VarArgsProblems

このディテクタは,J2SE 5.0の可変長引数に起因する問題を探します。

FindPuzzlers

このディテクタは,Joshua Bloch と Neal Gafter が『Java Puzzlers』で言及した多方面にわたるささいな誤りを探します。

IntCast2LongAsInstant

このディテクタは,エポックからミリ秒を記述する32ビット値の使い方を見つけます。

FindSleepWithLockHeld

このディテクタは,ロックを保持している状態での Thread.sleep() の呼び出しを探します。

低速ディテクタです。

DuplicateBranches

このディテクタは,2つの分岐に同じコードがある if/else または switch 文を探します。 これは多くの場合,2つの分岐に同じコードをコピー & ペーストしていることが片方の分岐の間違ったロジックの原因になります。

XMLFactoryBypass

このディテクタは,XML インタフェースを実装したクラスのインスタンスを直接生成しているコードを探します。 これらのオブジェクトを作成するために提供されたファクトリパターンを使用するのではなく,特定の実装にコードを結びつけます。

ConfusedInheritance

このディテクタは, protected メンバを宣言する final クラスを探します。 このクラスは派生させることができないので, protected メンバの使用は正しくありません。 アクセス権は,メンバの正しい意図を表すために publicprivate に変更すべきです。

おそらく,新しいパラダイムにクラスのすべてを完全に変更することではなく,クラスの使用中の変化が原因となりました。

QuestionableBooleanAssignment

このディテクタは,条件式で変数にリテラルブール値の単純な代入を探します。

AppendingToAnObjectOutputStream

このディテクタは,オブジェクト出力ストリームに追加しようとする試みを探します。

FindUnrelatedTypesInGenericContainer

このディテクタは,引数の型がコレクションのパラメータに関連しているかどうか確かめるために java.lang.Object を受け取る総称型コレクションメソッドへの呼び出しの引数を見ます。 無関係なクラス型による引数は決してコレクションの中に格納されることはありません。 たとえば, fooList<String> で, barStringBuffer なら foo.contains(bar) の呼び出しは常に false を返すことになります。

高速ディテクタです。

StaticCalendarDetector

Calendar は,マルチスレッドでの使用は本質的に安全ではないので,このディテクタは, java.util.Calendarjava.text.DateFormat (サブクラスも) の static フィールドについて警告します。

CheckTypeQualifiers

このディテクタは,JSR-305 の型修飾子アノテーションで特定されたプロパティの違反をチェックします。

CrossSiteScripting

このディテクタは XSS 脆弱性の自明で露骨なケースを探します。

DontIgnoreResultOfPutIfAbsent

このディテクタは, ConcurrentMapputIfAbsent メソッドの結果が無視されるなら,2番目の引数として渡された値が再利用されていないことをチェックします。

ReadOfInstanceFieldInMethodInvokedByConstructorInSuperclass

このディテクタは,スーパークラスのためのコンストラクタから呼び出されるメソッドをチェックします。

AtomicityProblem

このディテクタは,アトミックに実行されない並行抽象の操作シーケンス(たとえば,get/put)を見つけます。

DefaultEncodingDetector

このディテクタは,ユーザのデフォルトプラットフォームエンコーディングを使用して, byte から String (または String から byte) に変換するメソッドの呼び出しをチェックします。 これはアプリケーションの振る舞いがプラットフォーム間で異なる原因となります。

CheckRelaxingNullnessAnnotation

このディテクタは,オーバライドメソッドが 戻り値またはパラメータの @CheckForNull (@Nonnull で作られた) で @Nonnull (@CheckForNull で作られた) を緩和していないことをチェックします。

DontAssertInstanceofInTests

このディテクタは、インスタンスの型を instanceof 演算子を使って検証しているJUnitテストをチェックします。

instanceof 演算子を使うと "false is not true" という直感的でないメッセージを 伴う例外が記録されます。これは ClassCastException などよりも情報に乏しいため、他の手法を 用いることが推奨されます。

このディテクタは高速に動作します。

FindBadEndOfStreamCheck

Detector for patterns where the return value of java.io.FileInputStream.read() or java.io.FileReader.read() is converted before checking against -1.

Both methods return an int. If this int is converted to byte (in the case of FileInputStream.read()) then -1 and the byte 0xFF become indistinguishable. If it is converted to char (in the case of FileReader.read()) then -1 becomes 0xFFFF which is Character.MAX_VALUE since characters are unsigned in Java.

ReflectionIncreaseAccessibility

Detector for public methods instantiating a class they get in their parameter.

An attacker may invoke this method with a class that has no public constructor.

FindOverridableMethodCall

Detector for patterns where a constructor, a clone(), or a readObject() method calls an overridable method.

Calling an overridable method from a constructor may result in the use of uninitialized data. Calling such method from a clone(), or readObject() method is insecure.

ConstructorThrow

Finds constructors that throw exceptions.

FindInstanceLockOnSharedStaticData

Detector for patterns where a shared static data is modified by either an instance level non-static synchronized method, or inside a synchronized block, which used a non-static lock object.

Programs must not use instance locks to protect static shared data because instance locks are ineffective when two or more instances of the class are created. Consequently, failure to use a static lock object leaves the shared state unprotected against concurrent access.

DontUseFloatsAsLoopCounters

Checks for floats in loop counters.

PermissionsSuper

Checks method getPermissions() of classes implementing interface java.security.SecureClassLoader. The methods must always call super.getPermissions() to get the initial value of the object which they return at the end.

FindPotentialSecurityCheckBasedOnUntrustedSource

Looks for potential security checks on an untrusted source before entering a doPrivileged block.

FindAssertionsWithSideEffects

Finds assertions with side effects.

FindPublicAttributes

This detector looks for public attributes that are also written by the methods of the class.

FindVulnerableSecurityCheckMethods

Methods that perform security checks should be prevented from being overridden, so they must be declared as private or final. Otherwise, these methods can be compromised when a malicious subclass overrides them and omits the checks.

FindArgumentAssertions

Finds assertions that validate public method arguments.

UnnecessaryEnvUsage

Checks for calls of System.getenv(), where the variable has an equivalent Java property too.

MultipleInstantiationsOfSingletons

This detector looks for violations of the idioms for writing classes using singleton design pattern.

Disabled detectors

These detectors are off by default:

EmptyZipFileEntry

このディテクタは,空の zip ファイルエントリの作成を探します。

中速ディテクタです。

CallToUnsupportedMethod

このディテクタは,サポートされていないメソッドの呼び出しを探します。

CovariantArrayAssignment

このディテクタは,実行時に ArrayStoreException を引き起こすかもしれない Object[] array = new String[10] のような共変配列代入を探します。

InefficientInitializationInsideLoop

このディテクタは,パフォーマンスを向上させるために外側に移せるループ内で初期化しているオブジェクトを探します。

InefficientIndexOf

このディテクタは, String.indexOf(String) または String.lastIndexOf(String) を使用して定数に長さ1の文字列を渡すコードを探します。 より効率的な整数実装を使用することを推奨します。 高速ディテクタです。

InefficientToArray

このディテクタは, toArray(T[] a) メソッドに長さが0の配列を渡してコレクションを配列に変換するコードを探します。

BadAppletConstructor

このディテクタは, Applet スタブに依存する親 Applet でメソッドを呼び出す Applet コンストラクタを探します。 このスタブは init メソッドの前まで初期化されないので,これらのメソッドはコンストラクタで失敗します。

FindCircularDependencies

このディテクタは,クラス間の循環依存関係を探します。

PublicSemaphores

このディテクタは,同期化して this に対して wait メソッド, notify メソッド, notifyAll メソッドを使用する public クラスを探します。 これは public クラスの同期化実装を暴露することになります。 クラスのクライアントは,そのクラスのインスタンスをそれ自身の同期オブジェクトとして使用し,ベース実装に大惨事をもたらします。

InefficientMemberAccess

このディテクタは,所有クラスの private フィールドに書き込んでいる内部クラスを探します。 この場合,コンパイラは必ずこのフィールドへ書き込むことに使われるアクセサメソッドを生成します。 可視性を protected に緩和することは,フィールドに直接書き込むことを可能にします。

UselessSubclassMethod

このディテクタは,スーパークラスで定義されたメソッドを実装して,スーパークラスのメソッドにパラメータをそのまま渡しているだけのサブクラスを探します。 これらのメソッドは除去できます。

CheckExpectedWarnings

このディテクタは,@ExpectedWarning と @NoWarning アノテーションをチェックします。 このディテクタは,SpotBugs をテストするためだけに使われます。

ThrowingExceptions

This detector looks for methods throwing RuntimeException and methods that have Exception or Throwable in their throws clause.

DontReusePublicIdentifiers

Checks for reuse of public identifiers, public utility classes, interfaces, or packages in the Java Standard Library.