FindBugs 规则整理:Style & Dodgy

DLS_DEAD_LOCAL_STORE

  • 翻译
    Dead store to .. in …
    This instruction assigns a value to a local variable, but the value is not read or used in any subsequent instruction. Often, this indicates an error, because the value computed is never used.
    Note that Sun’s javac compiler often generates dead stores for final local variables. Because FindBugs is a bytecode-based tool, there is no easy way to eliminate these false positives.

    某个局部变量没有被应用过,这通常存在问题,但是javac编译器在编译局部变量时,也会产生dead stores,从而倒是FindBugs误报。
  • 原因
    同翻译
  • 解决方案
    删除无用的局部变量或视情况而定

DLS_DEAD_LOCAL_STORE_SHADOWS_FIELD

  • 翻译
    Dead store to … rather than field with same name in …
    This instruction assigns a value to a local variable, but the value is not read or used in any subsequent instruction. Often, this indicates an error, because the value computed is never used. There is a field with the same name as the local variable. Did you mean to assign to that variable instead?

    成员变量和局部变量重名
  • 原因
    同翻译
  • 解决方案
    修改某一个变量的命名

ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD

  • 翻译
    Write to static field … from instance method …
    This instance method writes to a static field. This is tricky to get correct if multiple instances are being manipulated, and generally bad practice.

    实例方法往静态域中执行写入操作,这会导致共享问题,因为其他实例也会访问该静态变量,但是却不知道某个实例已经修改了该静态变量的引用,导致不可预知的问题
  • 原因
    同翻译
  • 解决方案
    将修改静态域的实例方法改为静态方法

XSS_REQUEST_PARAMETER_TO_SEND_ERROR

Servlet reflected cross site scripting vulnerability
在代码中在Servlet输出中直接写入一个HTTP参数,这会造成一个跨站点的脚本漏洞。

XSS_REQUEST_PARAMETER_TO_SERVLET_WRITER

Servlet reflected cross site scripting vulnerability
代码直接写入参数的HTTP服务器错误页(使用HttpServletResponse.sendError)。表达了类似的不受信任的输入会引起跨站点脚本漏洞。

BC_BAD_CAST_TO_ABSTRACT_COLLECTION

Questionable cast to abstract collection
在代码中把一个集合强制类型转换为一个抽象的集合(如list,set或map)。保证该对象类型和将要转换的类型是一致的。如果你只是想要便利一个集合,那么你就不必将它转换为Set或List。

BC_BAD_CAST_TO_CONCRETE_COLLECTION

Questionable cast to concrete collection
代码把抽象的集合(如List,Set,或Collection)强制转换为具体落实类型(如一个ArrayList或HashSet)。这可能不正确,也可能使您的代码很脆弱,因为它使得难以在今后的切换指向其他具体实现。除非你有特别理由这样做,否则只需要使用抽象的集合类。

BC_UNCONFIRMED_CAST

Unchecked/unconfirmed cast
强制类型转换操作没有经过验证,而且不是所有的此种类型装换过的类都可以再强制类型转换为原类型。在代码中需要进行逻辑判断以保证可以进行这样的操作。

BC_VACUOUS_INSTANCEOF

instanceof will always return true
instanceof测试将始终返回真(除非被测试的值为空)。虽然这是安全,确保它是不是说明一些误解或其他一些逻辑错误。如果你真的想测试是空的价值,也许会更清楚这样做的更好空试验,而不是一个instanceof测试。这种情况可能发生中该实例肯定是该类的对象。

ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT

Unsigned right shift cast to short/byte
无符号数右移后进行转换为short或者byte类型时可能会丢弃掉高位的值,这样的结果就是有符合数和无符号数无法区分(这取决于移位大小)

CI_CONFUSED_INHERITANCE

Class is final but declares protected field
这个类被声明为final的,而是字段属性却声明为保护类型的。由于是final类,它不能再被继承,而再声明为保护类型的很容易造成混淆。为了从外部能正确的使用它应该把它们声明为private或者public类型。

DB_DUPLICATE_BRANCHES

Method uses the same code for two branches
此方法使用相同的代码,以实现两个有条件的分支。检查以确保这是不是一个编码错误。

DB_DUPLICATE_SWITCH_CLAUSES

Method uses the same code for two switch clauses
他的方法使用相同的代码来实现两个switch的声明条款。这可能是重复代码的情况,但可能也显示出编码的错误。

DLS_DEAD_LOCAL_STORE_IN_RETURN

Useless assignment in return statement
本声明把一个局部变量放到方法的返回语句中。这对于方法中局部变量来说是没有意义的。

DLS_DEAD_LOCAL_STORE_OF_NULL

Dead store of null to local variable
把一个本地变量赋值为null值,并且再也没有对这个变量做任何的操作。这样可能是为了垃圾回收,而在Java SE 6.0,这已不再需要。

DMI_HARDCODED_ABSOLUTE_FILENAME

Code contains a hard coded reference to an absolute pathname
类包含一个硬编码的绝对路径

DMI_NONSERIALIZABLE_OBJECT_WRITTEN

Non serializable object written to ObjectOutput
代码中让一个非序列化的对象出现在ObjectOutput.writeObject()方法中,这样会引起一个错误。

DMI_USELESS_SUBSTRING

Invocation of substring(0), which returns the original value
此代码调用了subString(0)方法,它将返回原来的值。

EQ_DOESNT_OVERRIDE_EQUALS

Class doesn’t override equals in superclass
子类定义了一个新的equals方法但是却不是覆写了父类本省的equals()方法。

FE_FLOATING_POINT_EQUALITY

Test for floating point equality
此操作比较两个浮点值是否相等。由于浮点运算可能会涉及到舍入,计算float和double值可能不准确。如果要求值必须准确,如货币值,可以考虑使用固定精度类型,如BigDecimal类型的值来比较

VA_FORMAT_STRING_BAD_CONVERSION_TO_BOOLEAN

Non-Boolean argument formatted using %b format specifier
使用%b去格式化Boolean类型的值是不正确的,但是它不会抛出异常,任何非空的值都会输出true,任何为空的值都会输出false

IC_INIT_CIRCULARITY

Initialization circularity
初始化死循环

ICAST_IDIV_CAST_TO_DOUBLE

integral division result cast to double or float
整形数除法强制转换为double或者float类型。

ICAST_INTEGER_MULTIPLY_CAST_TO_LONG

Result of integer multiplication cast to long
整形乘法的结果转换为long型

IM_AVERAGE_COMPUTATION_COULD_OVERFLOW

Computation of average could overflow
计算平均值可能溢出

INT_VACUOUS_COMPARISON

Vacuous comparison of integer value
整形数进行比较结果总是不变。例如:x <= Integer.MAX_VALUE

MTIA_SUSPECT_SERVLET_INSTANCE_FIELD

Class extends Servlet class and uses instance variables
这个类扩展从Servlet类,并使用实例的成员变量。由于只有一个Servlet类的实例,并在多线程方式使用,这种模式有可能存在问题。考虑只使用方法的局部变量。

MTIA_SUSPECT_STRUTS_INSTANCE_FIELD

Class extends Struts Action class and uses instance variables
类扩展自Struts的Action类并使用这个实例的成员变量,因为在Struts框架中只存在一个Action实例对象并且使用在多线程的情况下很可能会出现问题。

NP_DEREFERENCE_OF_READLINE_VALUE

Dereference of the result of readLine() without nullcheck
对readLine()的结果值没有进行判空操作就去重新赋值,这样的操作可以会抛出空指针异常。

NP_IMMEDIATE_DEREFERENCE_OF_READLINE

Immediate dereference of the result of readLine()
对readLine()的结果立即赋值,这样的操作可以会抛出空指针异常。

NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE

Possible null pointer dereference due to return value of called method
方法的返回值没有进行是否为空的检查就重新赋值,这样可能会出现空指针异常。

NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE

Parameter must be nonnull but is marked as nullable
参数值在任何情况下都不能为空,但是有明确的注释它可以为空。

NS_DANGEROUS_NON_SHORT_CIRCUIT

Potentially dangerous use of non-short-circuit logic
代码中使用(& or |)代替(&& or ||)操作,这会造成潜在的危险。

NS_NON_SHORT_CIRCUIT

Questionable use of non-short-circuit logic
代码中使用(& or |)代替(&& or ||)操作,会引起不安全的操作

PZLA_PREFER_ZERO_LENGTH_ARRAYS

Consider returning a zero length array rather than null
考虑返回一个零长度的数组,而不是null值

QF_QUESTIONABLE_FOR_LOOP

Complicated, subtle or wrong increment in for-loop
for循环中存在复杂,微妙或者错误的自增

RCN_REDUNDANT_COMPARISON_OF_NULL_AND_NONNULL_VALUE

Redundant comparison of non-null value to null
重复比较非空值和null

RCN_REDUNDANT_COMPARISON_TWO_NULL_VALUES

Redundant comparison of two null values
方法中对两个null值进行比较

RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE

Redundant nullcheck of value known to be non-null
方法中对不为空的值进行为空的判断。

REC_CATCH_EXCEPTION

Exception is caught when Exception is not thrown
捕获了没有抛出的异常

RI_REDUNDANT_INTERFACES

Class implements same interface as superclass
子类和父类都实现了同一个接口,这种定义是多余的。

RV_DONT_JUST_NULL_CHECK_READLINE

Method discards result of readLine after checking if it is nonnull
readLine方法的结果不为空时被抛弃

RV_REM_OF_RANDOM_INT

Remainder of 32-bit signed random integer
此代码生成一个随机的符号整数,然后计算另一个值的。由于随机数可以是负数,所以其余操作的结果也可以是负面的。考虑使用Random.nextInt(int)方法代替。

SA_LOCAL_DOUBLE_ASSIGNMENT

Double assignment of local variable
为一个局部变量两次赋值,这样是没有意义的。

SA_LOCAL_SELF_ASSIGNMENT

Self assignment of local variable
局部变量使用自身给自己赋值

SF_SWITCH_FALLTHROUGH

Switch statement found where one case falls through to the next case
Switch语句中一个分支执行后又执行了下一个分支。通常case后面要跟break 或者return语句来跳出。

SF_SWITCH_NO_DEFAULT

Switch statement found where default case is missing
Switch没有默认情况下执行的case语句。

SE_PRIVATE_READ_RESOLVE_NOT_INHERITED

private readResolve method not inherited by subclasses
声明为private的序列化方不能被子类继承

UCF_USELESS_CONTROL_FLOW

Useless control flow
没有任何作用的条件语句。

UCF_USELESS_CONTROL_FLOW_NEXT_LINE

Useless control flow to next line
无效的条件控制语句,注意if (argv.length == 1);以“;”结尾,下面的语句无论是否满足都会运行。
if (argv.length == 1);
System.out.println(“Hello, “ + argv[0]);

UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR

Field not initialized in constructor
字段从来没有在任何构造函数初始化,对象被创建后值为空。如果该字段未被定义就重新赋值会产生一个空指针异常。

XFB_XML_FACTORY_BYPASS

Method directly allocates a specific implementation of xml interfaces
方法自定义了一种XML接口的实现类。最好是使用官方提供的工厂类来创建这些对象,以便可以在运行期中改变。例如:
javax.xml.parsers.DocumentBuilderFactory
javax.xml.parsers.SAXParserFactory
javax.xml.transform.TransformerFactory
org.w3c.dom.Document.createXXXX

其他文章(持续更新)

FindBugs:简介与使用
FindBugs 规则整理:Bad Practice
FindBugs 规则整理:Security & Experimental
FindBugs 规则整理:Internationalization
FindBugs 规则整理:Malicious Code Vulnerability
FindBugs 规则整理:Performance
FindBugs 规则整理:Multithreaded Correctness
FindBugs 规则整理:CORRECTNESS

引用

整合以下文章过程中发现部分存在翻译错误,已做修正,同时感谢以下文章作者
FindBugs使用备忘录
FindBugs规则整理
详解FindBugs的各项检测器
Findbugs 缺陷详解与英文代号的对照表


版权声明

![Creative Commons BY-NC-ND 4.0 International License](/images/cc.png)

Lam’s Blog by Binghe Lin is licensed under a Creative Commons BY-NC-ND 4.0 International License.
林炳河创作并维护的Lam’s Blog采用创作共用保留署名-非商业-禁止演绎4.0国际许可证

本文首发于Lam’s Blog - Knowledeg as Action,版权所有,侵权必究。

本文永久链接:http://linbinghe.com/2017/eb74f6c5.html