FindBugs 规则整理:Style & Dodgy

作者: 格子林ll | 来源:发表于2016-12-13 14:48 被阅读0次

    目前已转至个人博客,本系列地址:Lam's Blog - Knowledge as Action

    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 规则整理:CORRECTNESS
    FindBugs 规则整理:Bad Practice
    FindBugs 规则整理:Malicious Code Vulnerability
    FindBugs 规则整理:Multithreaded Correctness
    FindBugs 规则整理:Security & Experimental
    FindBugs 规则整理:Performance
    FindBugs 规则整理:Internationalization

    引用

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

    相关文章

      网友评论

        本文标题:FindBugs 规则整理:Style & Dodgy

        本文链接:https://www.haomeiwen.com/subject/wfxbmttx.html