检测器
本文档列出了 SpotBugs 中的所有检测器。
标准检测器
以下检测器默认启用:
OverridingMethodsMustInvokeSuperDetector
查找必须调用 super 的重写方法。
- CN: 父类方法被标注了 @OverridingMethodsMustInvokeSuper,但重写方法并未调用父类方法。 (OVERRIDING_METHODS_MUST_INVOKE_SUPER)
FindRoughConstants
查找与 Math.PI 等已知值大致(但并不精确)相等的常量。
SynchronizeAndNullCheckField
该检测器查找先进行同步、随后进行空值检查的字段。
InitializeNonnullFieldsInConstructor
查找在构造方法中未被赋值的非空字段。
BooleanReturnNull
查找返回类型为 Boolean 但显式返回 null 值的方法。
OptionalReturnNull
查找返回类型为 Optional 但显式返回 null 值的方法。
ConfusionBetweenInheritedAndOuterMethod
查找继承方法与外部类方法之间可能产生的混淆。
SynchronizationOnSharedBuiltinConstant
该检测器查找针对共享内置常量(例如 String)的同步操作。
DL: 对驻留的 String 进行同步 (DL_SYNCHRONIZATION_ON_INTERNED_STRING)
DL: 对装箱的基本类型值进行同步 (DL_SYNCHRONIZATION_ON_UNSHARED_BOXED_PRIMITIVE)
NoteUnconditionalParamDerefs
分析应用程序中的所有方法,以确定哪些方法会无条件地解引用参数。该信息会在后续的分析阶段中使用,用于查找可能向这些方法传递 null 值的调用点。
这是一个较慢的检测器。
NP: equals() 方法未检查参数是否为 null (NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT)
NP: 参数必须非空,却被标记为可空 (NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE)
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) 中的第二个条件。
FormatStringChecker
检查不正确的格式字符串。
LostLoggerDueToWeakReference
该检测器会找出在 OpenJDK 6 下行为不同的代码,因为 OpenJDK 6 使用弱引用来持有 Logger。
EqualsOperandShouldHaveClassCompatibleWithThis
检查 equals 方法是否对其操作数是否为某个类的实例进行判断,而该类与定义该 equals 方法的类不兼容。
CheckImmutableAnnotation
查找违反标注为 net.jcip.annotations.Immutable 或 javax.annotation.concurrent.Immutable 的类相关规则的情况。
DontCatchIllegalMonitorStateException
该检测器会查找捕获 IllegalMonitorStateException 的 try-catch 块。
CloneIdiom
该检测器会查找编写可克隆类时违反惯用写法的情况。
ComparatorIdiom
该检测器会查找编写实现 Comparator 的类时违反惯用写法的情况。
FindFieldSelfAssignment
该检测器会查找通过读取同一字段的值来为该字段赋值的位置。
FindSelfComparison
该检测器会查找将值与自身进行比较的位置。
FindSelfComparison2
该检测器会查找将值与自身进行比较的位置。
DroppedException
该检测器会查找捕获了异常但未对该异常做任何处理的代码。
LoadOfKnownNullValue
查找对已知为 null 的值的加载操作。
DumbMethodInvocations
该检测器用于查找传递给方法的错误参数(例如 substring(0))。
URLProblems
java.net.URL 上的 equals 和 hashCode 方法会解析域名。因此,这些操作的开销可能非常大,该检测器用于查找可能调用这些方法的地方。
DumbMethods
该检测器用于查找对无意义方法的调用,例如无参的 String 构造函数。
BC: equals 方法不应对参数类型做任何假设(BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS)
Dm: 无法使用反射检查不带运行时保留策略的注解是否存在(DMI_ANNOTATION_IS_NOT_VISIBLE_TO_REFLECTION)
DMI: 由无法精确表示的 double 构造 BigDecimal(DMI_BIGDECIMAL_CONSTRUCTED_FROM_DOUBLE)
DMI: 在 int 上调用了 Double.longBitsToDouble(DMI_LONG_BITS_TO_DOUBLE_INVOKED_ON_INT)
Dm: 在需要 Runnable 的位置传入了 Thread(DMI_THREAD_PASSED_WHERE_RUNNABLE_EXPECTED)
Dm: 对 EasyMock 方法的无效/空洞调用(DMI_VACUOUS_CALL_TO_EASYMOCK_METHOD)
Dm: 方法调用了低效的 Boolean 构造函数;请改用 Boolean.valueOf(…)(DM_BOOLEAN_CTOR)
Dm:在 Condition 上调用了监视器的 wait()(DM_MONITOR_WAIT_ON_CONDITION)
Dm:使用 Random 的 nextInt 方法,而不是通过 nextDouble 来生成随机整数(DM_NEXTINT_VIA_NEXTDOUBLE)
Dm:方法调用了危险的方法 runFinalizersOnExit(DM_RUN_FINALIZERS_ON_EXIT)
INT:非负值与负常量或零的错误比较(INT_BAD_COMPARISON_WITH_NONNEGATIVE_VALUE)
NP:立即解引用 readLine() 的结果(NP_IMMEDIATE_DEREFERENCE_OF_READLINE)
RV:错误地计算带符号 32 位 hashcode 的绝对值(RV_ABSOLUTE_VALUE_OF_HASHCODE)
SW:某些 swing 方法必须在 Swing 线程中调用(SW_SWING_METHODS_INVOKED_IN_SWING_THREAD)
NumberConstructor
查找以基本类型为参数调用 Number 构造函数的情况。
FindSqlInjection
该检测器使用数据流分析来查找对 SQL 语句的 execute 方法的调用,其中作为参数传递的并非常量字符串。
SQL: 向 SQL 语句的 execute 或 addBatch 方法传递了非常量字符串(SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE)
SQL: 由非常量字符串生成了预编译语句(SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING)
FindDoubleCheck
该检测器用于查找双重检查锁定的实例。
FindFinalizeInvocations
该检测器用于查找对 finalize() 的调用以及其他与终结器相关的问题。
FindHEmismatch
该检测器用于查找 hashCode() 和 equals() 方法定义中的问题。
Eq: 类定义了 compareTo(…) 并使用 Object.equals()(EQ_COMPARETO_USE_OBJECT_EQUALS)
Eq: 定义的 equals() 方法未覆盖 Object.equals(Object)(EQ_OTHER_USE_OBJECT)
Eq: 定义了协变的 equals() 方法,并继承了 Object.equals(Object)(EQ_SELF_USE_OBJECT)
HE: 类定义了 equals() 并使用 Object.hashCode()(HE_EQUALS_USE_HASHCODE)
HE: 类定义了 hashCode() 并使用 Object.equals()(HE_HASHCODE_USE_OBJECT_EQUALS)
HE: 类继承了 equals() 并使用 Object.hashCode()(HE_INHERITS_EQUALS_USE_HASHCODE)
HE: 签名声明在哈希结构中使用了不可哈希的类(HE_SIGNATURE_DECLARES_HASHING_OF_UNHASHABLE_CLASS)
OverridingEqualsNotSymmetrical
查找重写超类中 equals 方法、且其等价关系可能不对称的 equals 方法。
FindNakedNotify
该检测器查找看起来不会修改可变对象状态的 notify() 调用。
FindReturnRef
该检测器查找返回可变静态数据的方法。
FindRunInvocations
该检测器查找对 Thread.run() 的调用。它是一个快速检测器。
SwitchFallthrough
该检测器查找包含贯穿(fall through)的 switch 语句。
SF:因 switch 语句贯穿而导致的死存储(SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH)
SF:因 switch 语句贯穿到 throw 而导致的死存储(SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH_TO_THROW)
FindSpinLoop
该检测器查找通过不断读取某个字段来自旋的循环。
FindNonShortCircuit
该检测器查找可疑的非短路布尔运算符用法(使用了 | 和 & 而不是 || 和 &&)。
FindTwoLockWait
该检测器用于查找在持有两个(或更多)锁的情况下调用 wait() 的情况。这是一个较慢的检测器。
FindUnconditionalWait
该检测器用于查找不在条件语句或循环中的 wait() 调用。
FindUninitializedGet
该检测器用于查找构造函数中对未初始化字段的读取。
DontUseEnum
检查字段和方法是否未使用 assert 或 enum 作为名称,因为它们在 Java 5 中是关键字。
Nm:使用了在更高版本 Java 中为关键字的标识符(NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER)
Nm:使用了在更高版本 Java 中为关键字的标识符(NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER)
FindUnsyncGet
该检测器用于查找 getter 和 setter 方法中 getter 未加同步而 setter 已加同步的情况。
InitializationChain
该检测器用于查找可能存在的循环类初始化依赖关系。
IteratorIdioms
该检测器用于查找 Iterator 类定义方式中存在的问题。
PreferZeroLengthArrays
该检测器用于查找既返回数组又返回显式 null 引用的方法。在这种情况下,通常返回零长度数组比返回 null 引用更可取。
SynchronizingOnContentsOfFieldToProtectField
该检测器用于查找似乎为了保护对某个字段的更新而在该字段上进行同步的代码。
MutableLock
该检测器用于查找在从被修改字段中读取的对象上进行同步的情况。
FindUselessObjects
查找无用的对象。
MutableStaticFields
该检测器用于查找可能被恶意代码修改的静态字段。
命名
该检测器用于查找可疑的命名方法。
ReadReturnShouldBeChecked
该检测器用于查找调用了 InputStream.read() 或 InputStream.skip() 却忽略其返回值的情况。
SerializableIdiom
该检测器用于查找 Serializable 类实现中潜在的问题。
Se: serialVersionUID 不是 final 的(SE_NONFINAL_SERIALVERSIONID)
Se: serialVersionUID 不是 static 的(SE_NONSTATIC_SERIALVERSIONID)
SnVI: 类实现了 Serializable,但未定义 serialVersionUID(SE_NO_SERIALVERSIONID)
Se: 类实现了 Serializable,但其父类未定义无参构造函数(SE_NO_SUITABLE_CONSTRUCTOR)
Se: 类实现了 Externalizable,但未定义无参构造函数(SE_NO_SUITABLE_CONSTRUCTOR_FOR_EXTERNALIZATION)
Se: 私有的 readResolve 方法不会被子类继承(SE_PRIVATE_READ_RESOLVE_NOT_INHERITED)
Se: readResolve 方法的返回类型必须声明为 Object。(SE_READ_RESOLVE_MUST_RETURN_OBJECT)
Se: 非 Serializable 类的瞬态字段。(SE_TRANSIENT_FIELD_OF_NONSERIALIZABLE_CLASS)
WS: 类的 writeObject() 方法是 synchronized 的,但其他方法都不是(WS_WRITEOBJECT_SYNC)
StartInConstructor
该检测器查找会启动线程的构造函数。
FindBadForLoop
该检测器查找不正确的 for 循环。
ExplicitSerialization
查找通过 readObject 和 writeObject 进行的显式序列化,作为该类确实被序列化的证据。
- ``
UnreadFields
此检测器用于查找其值从未被读取的字段。
NP: 读取未写入的 public 或 protected 字段(NP_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD)]
SIC: 非静态内部类与 ThreadLocal 的致命纠缠(SIC_THREADLOCAL_DEADLY_EMBRACE)]
UrF: 未读取的 public/protected 字段(URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD)]
UuF: 未使用的 public 或 protected 字段(UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD)]
UwF: 字段未在构造方法中初始化,却在未进行 null 检查的情况下被解引用(UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR)]
UwF: 未写入的 public 或 protected 字段(UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD)]
WaitInLoop
此检测器用于查找未处于循环中的 wait() 调用。
FindComparatorProblems
此检测器用于查找 Comparator.compare 或 Comparable.compareTo 实现中的问题。
Co: compareTo()/compare() 对 float 或 double 值的处理不正确(CO_COMPARETO_INCORRECT_FLOATING)]
Co: compareTo()/compare() 返回 Integer.MIN_VALUE(CO_COMPARETO_RESULTS_MIN_VALUE)]
FindNullDeref
此检测器用于查找可能发生空指针异常的地方,同时也查找引用值与 null 的冗余比较。这是一个较慢的检测器。
NP: 未进行 null 检查即解引用 readLine() 的结果(NP_DEREFERENCE_OF_READLINE_VALUE)]
NP: equals() 方法未对 null 参数进行检查(NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT)]
[NP:值为 null 且在异常路径上必然被解引用(NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#np-guaranteed-deref-on-exception-path)
[NP:方法调用向非空参数传递了 null(NP_NONNULL_PARAM_VIOLATION)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#np-nonnull-param-violation)
[NP:方法可能返回 null,但声明为 @Nonnull(NP_NONNULL_RETURN_VIOLATION)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#np-nonnull-return-violation)
[NP:可能的空指针解引用(NP_NULL_ON_SOME_PATH)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#np-null-on-some-path)
[NP:方法在异常路径上可能的空指针解引用(NP_NULL_ON_SOME_PATH_EXCEPTION)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#np-null-on-some-path-exception)
[NP:由于被调用方法的返回值导致的可能的空指针解引用(NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#np-null-on-some-path-from-return-value)
[NP:在可能不可行的分支上可能的空指针解引用(NP_NULL_ON_SOME_PATH_MIGHT_BE_INFEASIBLE)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#np-null-on-some-path-might-be-infeasible)
[NP:方法调用向非空参数传递了 null(NP_NULL_PARAM_DEREF)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#np-null-param-deref)
[NP:方法调用向非空参数传递了 null(NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#np-null-param-deref-all-targets-dangerous)
[NP:非虚方法调用向非空参数传递了 null(NP_NULL_PARAM_DEREF_NONVIRTUAL)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#np-null-param-deref-nonvirtual)
[NP:将 null 值存入标注为 @Nonnull 的字段(NP_STORE_INTO_NONNULL_FIELD)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#np-store-into-nonnull-field)
[NP:toString 方法可能返回 null(NP_TOSTRING_COULD_RETURN_NULL)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#np-tostring-could-return-null)
[RCN:对非空值与 null 进行了冗余比较(RCN_REDUNDANT_COMPARISON_OF_NULL_AND_NONNULL_VALUE)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#rcn-redundant-comparison-of-null-and-nonnull-value)
[RCN:对两个 null 值进行了冗余比较(RCN_REDUNDANT_COMPARISON_TWO_NULL_VALUES)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#rcn-redundant-comparison-two-null-values)
[RCN:对已知非空的值进行了冗余的 null 检查(RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#rcn-redundant-nullcheck-of-nonnull-value)
[RCN:对已知为 null 的值进行了冗余的 null 检查(RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#rcn-redundant-nullcheck-of-null-value)
[RCN:对先前已被解引用的值进行 null 检查(RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#rcn-redundant-nullcheck-would-have-been-a-npe)
FindNullDerefsInvolvingNonShortCircuitEvaluation
该检测器用于查找可能发生空指针异常的位置,在这些位置上使用了非短路求值,导致常用的技术手段失效。
[NP:null 值必然会被解引用(NP_GUARANTEED_DEREF)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#np-guaranteed-deref)
[NP:可能的空指针解引用(NP_NULL_ON_SOME_PATH)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#np-null-on-some-path)
FindOpenStream
该检测器用于查找未逸出方法、且在方法的所有退出路径上似乎都未被关闭的 IO 流对象。它是一个较慢的检测器。
[ODR:方法可能未关闭数据库资源(ODR_OPEN_DATABASE_RESOURCE)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#odr-open-database-resource)
[ODR:方法在异常时可能未关闭数据库资源(ODR_OPEN_DATABASE_RESOURCE_EXCEPTION_PATH)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#odr-open-database-resource-exception-path)
[OS:方法可能未关闭流(OS_OPEN_STREAM)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#os-open-stream)
[OS:方法在异常时可能未关闭流(OS_OPEN_STREAM_EXCEPTION_PATH)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#os-open-stream-exception-path)
FindUselessControlFlow
该检测器用于查找没有任何作用的控制流语句。
[UCF:无用的控制流(UCF_USELESS_CONTROL_FLOW)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#ucf-useless-control-flow)
[UCF:跳转到下一行的无用控制流(UCF_USELESS_CONTROL_FLOW_NEXT_LINE)]](https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#ucf-useless-control-flow-next-line)
FindUnreleasedLock
此检测器用于查找已被获取、但在方法的所有退出路径上均未释放的 JSR-166(java.util.concurrent)锁。它是一个中等速度的检测器。注意,要使用此检测器,需要在辅助类路径中包含 java.util.concurrent 包(或者正在分析该包本身)。
FindRefComparison
此检测器用于查找使用 == 或 != 运算符比较两个引用值的位置,且该类属于某种类型(例如 java.lang.String),比较引用值通常是一种错误。它是一个较慢的检测器。
EC: 使用指针相等性比较不同的类型(EC_UNRELATED_TYPES_USING_POINTER_EQUALITY)
ES: 使用 == 或 != 比较 String 参数(ES_COMPARING_PARAMETER_STRING_WITH_EQ)
RC: 对 Boolean 值进行的可疑引用比较(RC_REF_COMPARISON_BAD_PRACTICE_BOOLEAN)
FindMismatchedWaitOrNotify
此检测器用于查找看似未在当前被锁定的对象上调用 wait()、notify() 或 notifyAll() 的情况。它是一个中等速度的检测器。该检测器已被禁用,因为它仍在开发中,并且会产生过多的误报。
FindEmptySynchronizedBlock
此检测器用于查找空的 synchronized 块。
FindInconsistentSync2
此检测器用于查找在加锁方面访问方式不一致的字段。它是一个较慢的检测器。
FindLocalSelfAssignment2
此检测器用于查找局部变量的自赋值。
IncompatMask
该检测器用于查找可疑的按位逻辑表达式。
LazyInit
该检测器用于查找字段不是 volatile 的延迟字段初始化。这是一个中等速度的检测器。
FindJSR166LockMonitorenter
该检测器用于查找在 JSR166 锁上执行的普通同步。这是一个中等速度的检测器。
JLM: 在 util.concurrent 实例上执行同步 (JLM_JSR166_UTILCONCURRENT_MONITORENTER)
JLM: 在 util.concurrent 抽象上使用监视器风格的等待方法 (JML_JSR166_CALLING_WAIT_RATHER_THAN_AWAIT)
FindUncalledPrivateMethods
该检测器用于查找从未被调用的私有方法。
UncallableMethodOfAnonymousClass
该检测器用于查找匿名内部类,这些类定义了可能本意是重写、但实际上并未重写父类中方法的方法。
StringConcatenation
该检测器用于查找在循环中使用 + 进行的字符串拼接。
InvalidJUnitTest
该检测器用于查找格式不正确的 JUnit 测试。
IJU: TestCase 定义了 setUp 但未调用 super.setUp() (IJU_SETUP_NO_SUPER)
IJU: TestCase 定义了 tearDown 但未调用 super.tearDown() (IJU_TEARDOWN_NO_SUPER)
BadlyOverriddenAdapter
该检测器用于查找扩展 Adapter 类却以错误的签名重写 Listener 方法的代码。
BadResultSetAccess
该检测器用于查找对结果集的 getXXX 或 setXXX 方法的调用,其中字段索引为 0。由于 ResultSet 的字段索引从 1 开始,因此这始终是一个错误。
SuperfluousInstanceOf
此检测器查找使用 instanceof 运算符进行的类型检查,其中判断可以静态完成。
SuspiciousThreadInterrupted
此检测器查找在非静态上下文中对 Thread.interrupted() 的调用。如果它是通过 Thread.currentThread().interrupted() 调用的,那只是无用的操作,直接使用 Thread.interrupted() 即可。但是,如果它是在任意线程对象上调用的,那么这很可能是一个错误,因为 interrupted() 总是在当前线程上调用。
STI:为调用 interrupted() 而使用了不必要的 currentThread() 调用 (STI_INTERRUPTED_ON_CURRENTTHREAD)
STI:在 Thread 实例上调用了静态的 Thread.interrupted() 方法 (STI_INTERRUPTED_ON_UNKNOWNTHREAD)
FindDeadLocalStores
此检测器查找对局部变量的赋值,这些赋值随后从未被读取。它是一个中等速度的检测器。
FindMaskedFields
此检测器查找被方法中定义的局部字段所遮蔽的类级别字段。
WrongMapIterator
此检测器查找使用从 keySet 迭代器获取的键来访问 Map 条目的值的情况。
InstantiateStaticClass
此检测器查找基于仅定义静态方法的类来创建对象的代码。
RuntimeExceptionCapture
此检测器查找捕获 Exception 的 catch 子句,而该代码块中没有任何代码会抛出 Exception。
DontCatchNullPointerException
不应捕获空指针异常。
FindFloatEquality
查找浮点数相等性表达式。一个快速的检测器。
FindUnsatisfiedObligation
此检测器用于查找在方法的所有退出路径上均未被清理的 I/O 流和数据库资源。这是一个运行较慢的检测器。
UnnecessaryMath
此检测器用于查找对常量值调用 java.lang.Math 静态方法的代码,而其结果值在静态分析中是已知常量。直接使用该常量不仅更快,有时也更准确。
RedundantInterfaces
此检测器用于查找声明实现了与其父类相同接口的类。这是多余的:如果父类实现了某个接口,子类自然也实现了该接口。
MultithreadedInstanceAccess
此检测器用于查找实现 Struts 框架时的潜在问题。
MTIA: 类继承 Servlet 类并使用实例变量 (MTIA_SUSPECT_SERVLET_INSTANCE_FIELD)
MTIA: 类继承 Struts Action 类并使用实例变量 (MTIA_SUSPECT_STRUTS_INSTANCE_FIELD)
BadUseOfReturnValue
查找在检查返回值非空之后又将其丢弃的情况。
RV: 方法检查 String.indexOf 的结果是否为正数 (RV_CHECK_FOR_POSITIVE_INDEXOF)
RV: 方法在检查 readLine 结果非空之后将其丢弃 (RV_DONT_JUST_NULL_CHECK_READLINE)
MethodReturnCheck
此检测器用于查找对方法返回值被可疑地忽略的调用。
IDivResultCastToDouble
此检测器用于查找整数除法结果被转换为 double 的位置。通常,本意是先把整数操作数转换为 double,再进行除法运算。
ICAST: 整数除法结果被转换为 double 或 float (ICAST_IDIV_CAST_TO_DOUBLE)
ICAST:整型值被转换为 double,然后传给 Math.ceil(ICAST_INT_CAST_TO_DOUBLE_PASSED_TO_CEIL)
ICAST:int 值被转换为 float,然后传给 Math.round(ICAST_INT_CAST_TO_FLOAT_PASSED_TO_ROUND)
FindBadCast2
该检测器使用数据流分析查找对象引用的错误转换。
FindUseOfNonSerializableValue
该检测器查找在要求可序列化的上下文中使用了不可序列化对象的情况。
DMI:不可序列化对象被写入 ObjectOutput(DMI_NONSERIALIZABLE_OBJECT_WRITTEN)
J2EE:将不可序列化对象存入 HttpSession(J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION)
BadSyntaxForRegularExpression
该检测器查找语法无效的正则表达式。
VarArgsProblems
查找由 Java 5 可变参数引起的问题。
FindPuzzlers
该检测器查找 Joshua Bloch 和 Neal Gafter 在其著作《Programming Puzzlers》中提到的各种小错误。
Bx:基本类型值被装箱后又拆箱以执行基本类型强制转换(BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COERCION)
Bx:基本类型值被拆箱并为三元运算符进行强制转换(BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR)
DMI: 由于 Entry 对象被复用,添加条目集的元素可能会失败(DMI_ENTRY_SETS_MAY_REUSE_ENTRY_OBJECTS)
USELESS_STRING: 对匿名数组调用 toString(DMI_INVOKING_TOSTRING_ON_ANONYMOUS_ARRAY)
USELESS_STRING: 对数组调用 toString(DMI_INVOKING_TOSTRING_ON_ARRAY)
BSHIFT: 32 位 int 进行移位的位数不在 -31..31 范围内(ICAST_BAD_SHIFT_AMOUNT)
ICAST: 整数乘法的结果被转换为 long(ICAST_INTEGER_MULTIPLY_CAST_TO_LONG)
BSHIFT: 无符号右移的结果被转换为 short/byte(ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT)
IC: 超类在初始化期间使用了子类(IC_SUPERCLASS_USES_SUBCLASS_DURING_INITIALIZATION)
IJU: run 方法中的 JUnit 断言不会被 JUnit 识别(IJU_ASSERT_METHOD_INVOKED_FROM_RUN_METHOD)
PZ: 不要在迭代器中复用 entry 对象(PZ_DONT_REUSE_ENTRY_OBJECTS_IN_ITERATORS)
RV: 对 compareTo()/compare() 的结果取负(RV_NEGATING_RESULT_OF_COMPARETO)
IntCast2LongAsInstant
查找使用 32 位值来表示自纪元以来毫秒数的代码。
FindSleepWithLockHeld
该检测器查找在持有锁的情况下调用 Thread.sleep() 的代码。这是一个运行较慢的检测器。
DuplicateBranches
该检测器查找 if/else 或 switch 语句中两个分支包含相同代码的情况,从而使判断失去意义。这通常是由于复制粘贴了两个分支,导致其中一个分支的逻辑不正确。
XMLFactoryBypass
该检测器查找对 XML 接口实现类的直接实例化。这样会使代码与特定实现绑定,而不是使用所提供的工厂模式来创建这些对象。
ConfusedInheritance
该检测器用于查找声明了 protected 成员的 final 类。由于该类无法被继承,对成员使用 protected 访问权限是不正确的。访问权限应改为 public 或 private,以体现该字段的真实意图。这很可能是由于该类的用途发生了变化,但并未将整个类全部改造成新范式所致。
QuestionableBooleanAssignment
该检测器用于查找在条件表达式中将字面布尔值简单赋值给变量的情况。
AppendingToAnObjectOutputStream
查找向对象输出流追加内容的尝试。
StaticCalendarDetector
该检测器会警告类型为 java.util.Calendar 或 java.text.DateFormat(及其子类)的静态字段,因为 Calendar 在本质上不适用于多线程环境。
STCAL: 调用静态 Calendar (STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE)
STCAL: 调用静态 DateFormat (STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE)
STCAL: 静态 DateFormat (STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE)
CheckTypeQualifiers
检查是否违反 JSR-305 类型限定符注解所指定的属性。
TQ: 标注为带有某类型限定符的值,被用在要求该值不得带有该限定符的位置 (TQ_ALWAYS_VALUE_USED_WHERE_NEVER_REQUIRED)
TQ: 比较带有不兼容类型限定符的值 (TQ_COMPARING_VALUES_WITH_INCOMPATIBLE_TYPE_QUALIFIERS)
TQ: 要求值必须带有类型限定符,但其被标记为未知 (TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK)
TQ: 要求值不得带有类型限定符,但其被标记为未知 (TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_NEVER_SINK)
TQ: 可能不带有类型限定符的值,总是以要求该限定符的方式被使用 (TQ_MAYBE_SOURCE_VALUE_REACHES_ALWAYS_SINK)
TQ: 可能带有类型限定符的值,总是以禁止其带有该限定符的方式被使用 (TQ_MAYBE_SOURCE_VALUE_REACHES_NEVER_SINK)
TQ: 标注为从不带有某类型限定符的值,被用在要求该值带有该限定符的位置 (TQ_NEVER_VALUE_USED_WHERE_ALWAYS_REQUIRED)
TQ: 不带类型限定符的值,被用在要求该值必须带有该限定符的位置 (TQ_UNKNOWN_VALUE_USED_WHERE_ALWAYS_STRICTLY_REQUIRED)
CrossSiteScripting
该检测器用于查找明显、突出的跨站脚本漏洞案例。
HRS: 由不可信输入构造的 HTTP cookie (HRS_REQUEST_PARAMETER_TO_COOKIE)
XSS: 错误页面中的 Servlet 反射型跨站脚本漏洞 (XSS_REQUEST_PARAMETER_TO_SEND_ERROR)
XSS: Servlet 反射型跨站脚本漏洞 (XSS_REQUEST_PARAMETER_TO_SERVLET_WRITER)
DontIgnoreResultOfPutIfAbsent
检查在忽略 putIfAbsent 的返回值时,作为第二个参数传入的值没有被重复使用。
ReadOfInstanceFieldInMethodInvokedByConstructorInSuperclass
检查从超类的构造方法中调用的方法。
AtomicityProblem
查找在并发抽象上执行的、不会以原子方式执行的操作序列(例如 get/put)。
DefaultEncodingDetector
检查对那些使用用户默认平台编码进行字节与 String(或 String 与字节)转换的方法的调用。这会导致应用程序的行为在不同平台之间存在差异。
CheckReliasingNullnessAnnotation
检查重写的方法是否放宽了返回值上的 @Nonnull(改为 @CheckForNull),或放宽了参数上的 @CheckForNull(改为 @Nonnull)。
DontAssertInstanceofInTests
用于检测 JUnit 测试中通过断言 instanceof 运算符来检查对象类型的模式。
应当避免这种做法,因为不正确的强制类型转换所导致的 ClassCastException,可能比断言 instanceof 运算符结果时产生的 "false is not true" 消息提供更多关于错误原因的信息。
这是一个快速检测器
FindBadEndOfStreamCheck
用于检测在与 -1 比较之前先对 java.io.FileInputStream.read() 或 java.io.FileReader.read() 的返回值进行转换的模式。
两个方法都返回一个 int。如果将该 int 转换为 byte(FileInputStream.read() 的情况),则 -1 与字节 0xFF 将无法区分。如果转换为 char(FileReader.read() 的情况),则 -1 会变为 0xFFFF,即 Character.MAX_VALUE,因为在 Java 中字符是无符号的。
ReflectionIncreaseAccessibility
检测其实例化参数中所传入类的公共方法。
攻击者可能会用一个没有公共构造方法的类来调用此方法。
REFLC: 公共方法使用反射创建其参数中传入的类,这可能会提高任何类的可访问性 (REFLC_REFLECTION_MAY_INCREASE_ACCESSIBILITY_OF_CLASS)
REFLF: 公共方法使用反射修改其参数中传入的字段,这可能会提高任何类的可访问性 (REFLF_REFLECTION_MAY_INCREASE_ACCESSIBILITY_OF_FIELD)
FindOverridableMethodCall
检测构造方法、clone() 或 readObject() 方法调用可被重写方法的模式。
从构造方法中调用可被重写的方法可能导致使用未初始化的数据。从 clone() 或 readObject() 方法中调用此类方法则不安全。
MC: 在 clone() 方法中调用了可被重写的方法。(MC_OVERRIDABLE_METHOD_CALL_IN_CLONE)
MC: 在构造方法中调用了可被重写的方法 (MC_OVERRIDABLE_METHOD_CALL_IN_CONSTRUCTOR)
MC: 在 readObject 方法中调用了可被重写的方法。(MC_OVERRIDABLE_METHOD_CALL_IN_READ_OBJECT)
ConstructorThrow
查找会抛出异常的构造方法。
FindInstanceLockOnSharedStaticData
检测共享静态数据被实例级别的非静态同步方法修改,或在使用非静态锁对象的同步块内被修改的模式。
程序不得使用实例锁来保护静态共享数据,因为当创建两个或多个类的实例时,实例锁将不起作用。因此,若不使用静态锁对象,共享状态将无法免受并发访问的影响。
DontUseFloatsAsLoopCounters
检查循环计数器中的浮点数。
PermissionsSuper
检查实现接口 java.security.SecureClassLoader 的类的 getPermissions() 方法。这些方法必须始终调用 super.getPermissions(),以获取其最终返回对象的初始值。
FindPotentialSecurityCheckBasedOnUntrustedSource
查找在进入 doPrivileged 块之前,基于不可信源进行的潜在安全检查。
FindAssertionsWithSideEffects
查找具有副作用的断言。
FindPublicAttributes
该检测器查找既为 public、又被类的方法写入的属性。
FindVulnerableSecurityCheckMethods
执行安全检查的方法应当防止被覆盖,因此它们必须声明为 private 或 final。否则,当恶意子类覆盖这些方法并跳过检查时,这些方法可能被破坏。
FindArgumentAssertions
查找用于校验 public 方法参数的断言。
UnnecessaryEnvUsage
检查对 System.getenv() 的调用,其中相应变量同样存在等价的 Java 属性。
MultipleInstantiationsOfSingletons
该检测器查找对使用单例设计模式编写类的相关惯用写法的违反情况。
SING: 使用单例设计模式的类的实例获取方法未同步。(SING_SINGLETON_GETTER_NOT_SYNCHRONIZED)
SING: 使用单例设计模式的类具有非 private 的构造器。(SING_SINGLETON_HAS_NONPRIVATE_CONSTRUCTOR)
SING: 使用单例设计模式的类直接实现了 Cloneable 接口。(SING_SINGLETON_IMPLEMENTS_CLONEABLE)
SING: 使用单例设计模式的类直接或间接实现了 Serializable 接口。(SING_SINGLETON_IMPLEMENTS_SERIALIZABLE)
SING: 使用单例设计模式的类间接实现了 Cloneable 接口。(SING_SINGLETON_INDIRECTLY_IMPLEMENTS_CLONEABLE)
评论
登录后参与评论
KnowForge