findbugs检测提示详解

合集下载

findBug错误提示和解决

findBug错误提示和解决

1 Unwritten field参数没有set方法,添加一个set方法即可2Dead store to local variable in findbugs(本地变量存储了闲置不用的对象)Code:List<BY102010ResultDetailModel> detailList = new ArrayList();detailList = resultModel.getDetails();用findbugs执行后,说List<BY102010ResultDetailModel> detailList = new ArrayList();存在Dead store to local variable,中文意思是“本地变量存储了闲置不用的对象”。

原因:List<BY102010ResultDetailModel> detailList = new ArrayList();执行了一下三个动作1、创建一个引用2、创建一个ArrayList对象3、把ArrayList的引用赋值给detailList其中,后面两个动作变得会是多余的,因为后面的程序中你没有使用这个新建的ArrayList,而是重新给ArrayList赋值。

detailList = resultModel.getDetails();所以,只需要List<BY102010ResultDetailModel> detailList=null;即可。

3 Hard coded reference to an absolute pathnameBUG描述:This code constructs a File object using a hard coded to an absolute pathname (此代码包含文件对象为一个绝对路径名)问题原因:硬编码指向绝对路径。

File preFile = new File(PREFERENCES_FILE_FULL_PATH);而private static final String PREFERENCES_FILE_FULL_PATH ="/data/data/com.android.mms/shared_prefs/auto_downLoad.xml"; PREFERENCES_FILE_FULL_PATH声明为了final型,不可变的。

Java静态检测工具的简单介绍 - Sonar、Findbugs

Java静态检测工具的简单介绍 - Sonar、Findbugs

Java静态检测工具的简单介绍- Sonar、Findbugs2010-11-04 13:55:54标签:sonar休闲职场Java静态检测工具的简单介绍 from:/?p=9015静态检查:静态测试包括代码检查、静态结构分析、代码质量度量等。

它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行。

代码检查代码检查包括代码走查、桌面检查、代码审查等,主要检查代码和设计的一致性,代码对标准的遵循、可读性,代码的逻辑表达的正确性,代码结构的合理性等方面;可以发现违背程序编写标准的问题,程序中不安全、不明确和模糊的部分,找出程序中不可移植部分、违背程序编程风格的问题,包括变量检查、命名和类型审查、程序逻辑审查、程序语法检查和程序结构检查等内容。

”。

看了一系列的静态代码扫描或者叫静态代码分析工具后,总结对工具的看法:静态代码扫描工具,和编译器的某些功能其实是很相似的,他们也需要词法分析,语法分析,语意分析...但和编译器不一样的是他们可以自定义各种各样的复杂的规则去对代码进行分析。

静态检测工具:1.PMD1)PMD是一个代码检查工具,它用于分析 Java 源代码,找出潜在的问题:1)潜在的bug:空的try/catch/finally/switch语句2)未使用的代码:未使用的局部变量、参数、私有方法等3)可选的代码:String/StringBuffer的滥用4)复杂的表达式:不必须的if语句、可以使用while循环完成的for循环5)重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs2)PMD特点:1)与其他分析工具不同的是,PMD通过静态分析获知代码错误。

也就是说,在不运行Java程序的情况下报告错误。

2)PMD附带了许多可以直接使用的规则,利用这些规则可以找出Java源程序的许多问题3)用户还可以自己定义规则,检查Java代码是否符合某些特定的编码规范。

3)同时,PMD已经与JDeveloper、Eclipse、jEdit、JBuilder、BlueJ、CodeGuide、NetBeans、Sun JavaStudio Enterprise/Creator、IntelliJ IDEA、TextPad、Maven、Ant、Gel、JCreator以及Emacs 集成在一起。

IDEA插件FindBugs的使用详解

IDEA插件FindBugs的使用详解

IDEA插件FindBugs的使⽤详解前⾔Findbugs很多⼈都并不陌⽣,Eclipse中有插件可以帮助查找代码中隐藏的bug,IDEA中也有这款插件。

这个插件可以帮助我们查找隐藏的bug,⽐较重要的功能就是查找潜在的null指针。

在编写代码的过程中,我们可能不会⼀直记得检查空的引⽤,在我们测试时可能很难发现问题,但是应⽤上线之后,⾯对⼤量的⽤户,很多问题就会浮现出来。

所以在编码时,使⽤findbugs检查⼀下很有必要。

安装安装完之后,重启studio,会发现左下⾓会出现findbugs的图标可以分析单个⽂件,包下⾯的所有⽂件,整个module下的⽂件,整个project下的⽂件,右键想要分析的⽂件名/包名/module名/project分析完之后就会出现结果⾯板点击对应的item在右边会定位到具体的代码根据需要可以进⾏更改,其中Correctness这个错误使我们重点关注的对象,这⾥⼤多是空指针的错误,根据提⽰进⾏处理。

附:⼀些常见的错误信息Bad practice 代码中的⼀些坏习惯Class names should start with an upper case letter 主要包括类名的命名,以⼤写字母开头Method names should start with a lower case letter ⽅法名以⼩写字母开头Field names should start with a lower case letter 字段名以⼩写字母开头equals()method does not check for null argument equals()⽅法应该检查⾮空Class defines equals() and uses Object.hashCode() ⼀个类覆写了equals⽅法,没有覆写hashCode⽅法,使⽤了Object对象的hashCode⽅法Method ignores exceptional return value ⽅法忽略返回值的异常信息Equals method should not assume anything about the type of its argument equals(Object o)⽅法不能对参数o的类型做任何的假设。

代码审计工具Findbugs自动检查CheckList及配置方法

代码审计工具Findbugs自动检查CheckList及配置方法

代码审计工具Findbugs自动检查CheckList及配置方法
代码审计工具Findbugs是一个应用比较广泛的开源代码审计工具,如果开发团队利用好了这个工具,能够很大程度上提高软件产品的安全性。

而且重要的是Free。

首先,介绍一下安全审计配置文件的位置,网上都没有这方面的资料,我自己找了几个小时才找到。

这个配置文件不在安装文件夹,也不再Eclipse软件的文件夹,而是在具体项目的工作空间workspace中,具体位置是:workspace\.metadata\.plugins\edu.umd.cs.findbugs.plugin.eclipse\.fbprefs。

(以点开始的文件夹,还这么多层目录,很隐蔽!!!)
这个文件中,选中要审计的项目其配置值会是“TURE”,配置为不审计的项会是“FALSE”。

我们可以通过在工作中逐渐确定哪些安全项一定要检查,哪些不需要检查,确定之后,整个开发团队使用同一个配置文件,从而实现标准化、自动化地审查开发团队的代码。

开源工具Findbugs使用总结

开源工具Findbugs使用总结

开源⼯具Findbugs使⽤总结⼀、代码检查法概念⽩盒测试分为静态测试和动态测试。

代码检查法是静态测试的⼀种,主要是由⼈⼯进⾏,充分发挥⼈的逻辑思维优势,也可以借助软件⼯具⾃动进⾏。

代码检查包括代码⾛查、桌⾯检查、代码审查等,主要检查代码和设计的⼀致性,代码对标准的遵循、可读性,代码的逻辑表达的正确性,代码结构的合理性等⽅⾯;可以发现违背程序编写标准的问题,程序中不安全、不明确和模糊的部分,找出程序中不可移植部分、违背程序编程风格的问题,包括变量检查、命名和类型审查、程序逻辑审查、程序语法检查和程序结构检查等内容。

⼆、Findbugs⼯具介绍静态分析⼯具有很多,其中商业⼯具⽐较有名的有Klocwork,coverity,pc-lint,开源的有splint,Findbugs等。

以下主要介绍⼀下Findbugs⼯具。

Findbugs是⼀款Java静态代码分析⼯具,与其他静态分析⼯具(如Checkstyle和PMD)不同,Findbugs 不注重样式或者格式,它专注于寻找真正的缺陷或者潜在的性能问题,它可以帮助java⼯程师提⾼代码质量以及排除隐含的缺陷。

有了静态分析⼯具,就可以在不实际运⾏程序的情况对软件进⾏分析。

Findbugs运⽤Apache BCEL 库分析类⽂件(class⽂件)⽽不是源代码,将字节码与⼀组缺陷模式进⾏对⽐以发现可能的问题。

Findbugs 的检测器已增⾄300多条,被分为不同的类型,常见的类型如下:· 正确性(Correctness):这种归类下的问题在某种情况下会导致bug,⽐如错误的强制类型转换等。

· 最佳实践反例(Bad practice):这种类别下的代码违反了公认的最佳实践标准,⽐如某个类实现了equals⽅法但未实现hashCode⽅法等。

· 多线程正确性(Multithreaded correctness):关注于同步和多线程问题。

FindBugs使用手册

FindBugs使用手册

文件编号:配置项编号:FindBugs使用手册文档版本号V 1.0农信银资金清算中心创新研发部文档修订记录目录1、FindBugs简介 (4)2、FindBugs的检查规则 (4)2.1Correctness(正确性) (4)2.2 Bad practice(不良实践) (5)2.3 Performance(性能) (5)2.4Multithreaded correctness(多线程正确性) (6)2.5 Dodgy(不可靠) (7)3、FindBugs使用 (8)3.1安装FindBugs (8)3.2配置FindBugs (8)3.3使用FindBugs (8)1、FindBugs简介FindBugs是用于java代码检查的一种静态分析工具,它检查类或者JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。

有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。

FindBugs专注于找出潜在程序错误,而不是编码风格问题,目的在于提高程序的健壮性。

2、FindBugs的检查规则FindBugs提出了超过200种规则,这些规则可主要分为如下类别:2.1Correctness(正确性)这些问题涉及到可能在某些方面不正确的代码。

如:代码有无限递归,或者读取为写入的字段,这类问题几乎无疑是程序的错误。

例1:使用未初始化的类成员,可能导致NullPointException代码:FindBugs检测结果:例2:不使用方法的返回值代码:FindBugs检测结果:2.2Bad practice(不良实践)这类问题明确违反建议的编程标准。

如:删除异常,或未关闭文件,或未数据库连接资源等。

例3:未关闭打开的文件输出流资源代码:FindBugs检测结果:2.3Performance(性能)这类规则的目的在于检测潜在的性能问题。

如:代码创建了不需要的对象,或者在循环中使用字符串连接而不是使用StringBuffer。

Eclipse 插件 FindBugs 使用手册

Eclipse 插件FindBugs 使用手册前言:本文介绍如何利用Eclipse 插件FindBugs 优化Java 代码。

本插件是本人在对系统进行代码优化的时候,向迟焕祺同事索取并学习使用的,现在把工具的一些使用方法与大家共享,并把FindBugs提供给大家!感谢迟哥提供良好资源供大家学习、使用!问题提出:当我们编写完代码,做完单元测试等各种测试后就提交正式运行,只能由运行的系统来检测我们代码是否有问题了,代码中隐藏的错误在系统运行的过程中被发现后,然后再来进行相应的修改,那么后期修改的代价就相当高了。

解决方法:现在有很多Java 代码分析工具,FindBugs 中开源项目当中的一个,它可以帮你找到代码中隐藏的一些错误,提升你的代码能力与系统安全可靠性。

FindBugs 介绍FindBugs 是一个可以在Java 程序中发现Bugs 的程序。

它是专门用来寻找处于“Bug Patterns”列表中的代码的。

Bug Patterns 指很有可能是错误的代码的实例。

原文:FindBugs is a program to find bugs in Java programs. It looks for instances of "bug patterns" --- code instances that are likely to be errors.使用FindBugs 至少需要JDK1.4.0 以上版本,FindBugs是平台独立的,可以运行于GNU/Linux、Windows、MacOS X 等平台上。

运行FindBugs 至少需要有256 MB 内存,如果你要分析一个很大的项目,那就需要更加多的内存了。

获取FindBugs 最新版本:/projects/findbugs/files/FinBugs 介绍:/manual/Eclipse 插件links 文件夹方式配置:提示:直接的插件配置方式是使用Eclipse 的Update 方式更新,或者把新下载的插件PlugIn 放在原始的Eclipse 目录下去,这种方式会随着插件的增多而导致插件维护工作量的增加。

FindBugs错误说明对照表

rule.findbugs.BX_BOXING_IMMEDIATELY_=性能- 基本类型包装之后立刻解包rule.findbugs.IJU_SETUP_NO_=使用错误- TestCase定义的setUp没有调用super.setUp()rule.findbugs.TQ_ALWAYS_VALUE_USED_WHERE_NEVER_=使用错误- 某个值使用了注解限制类型,但是这个限制永远不会发生rule.findbugs.TLW_TWO_LOCK_=多线程错误- 等待两个被持有的锁rule.findbugs.RV_01_TO_=使用错误- 0至1的随机数被当做整数0rule.findbugs.NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABL =高危- 参数必须非null但是标记为可为nullrule.findbugs.RV_ABSOLUTE_VALUE_OF_RANDOM_=使用错误- 尝试计算32位随机整数的绝对值rule.findbugs.EC_INCOMPATIBLE_ARRAY_=使用错误- 使用equals()比较不兼容的数组rule.findbugs.UL_UNRELEASED_LOCK_EXCEPTION_=多线程错误- 方法没有在所有异常路径释放锁rule.findbugs.SE_NONSTATIC_=不良实践- serialVersionUID 不是static的rule.findbugs.UCF_USELESS_CONTROL_=高危- 无用控制流rule.findbugs.BC_IMPOSSIBLE_=使用错误- 不可能的转换rule.findbugs.XSS_REQUEST_PARAMETER_TO_SEND_=安全风险- servlet的反射导致跨站脚本漏洞rule.findbugs.DM_NEW_FOR_=性能- 仅为了获得一个方法就创建了一个对象rule.findbugs.OBL_UNSATISFIED_=试验- 方法可能在清理流或资源时失败rule.findbugs.UW_UNCOND_=多线程错误- 无条件等待rule.findbugs.DLS_DEAD_LOCAL_STORE_OF_=高危- 把null设置给不会用到的局部变量rule.findbugs.NM_CLASS_NAMING_=类名应该以大写字母开头rule.findbugs.RC_REF_COMPARISON_BAD_PRACTICE_=使用错误- 怀疑对两个布尔值的引用进行比较rule.findbugs.MWN_MISMATCHED_=多线程错误- 不匹配的notify()rule.findbugs.NM_VERY_=错误- 非常容易迷惑的方法名rule.findbugs.FI_NULLIFY_=不良实践- 空Finalizer禁用了超类的finalizerrule.findbugs.MTIA_SUSPECT_STRUTS_INSTANCE_=高危- 继承了struts Action的类使用了实例变量rule.findbugs.DM_STRING_=性能- 方法调用了效率很低的new String(String)构造方法rule.findbugs.STCAL_INVOKE_ON_STATIC_DATE_FORMAT_=多线程错误- 调用静态DateFormatrule.findbugs.NP_NULL_PARAM_DEREF_=使用错误- 非虚拟方法调用向非空参数传入了nullrule.findbugs.FI_=不良实践- 应该删除空的finalizerrule.findbugs.CD_CIRCULAR_=试验- 类间存在循环引用rule.findbugs.EC_UNRELATED_=使用错误- 使用equals()比较不同类型rule.findbugs.EI_EXPOSE_STATIC_=恶意代码漏洞- 把可变对象保存到静态字段中可能会暴露内部静态状态rule.findbugs.DMI_INVOKING_TOSTRING_ON_ANONYMOUS_=错误- 对数组执行toStringrule.findbugs.SIC_INNER_SHOULD_BE_STATIC_=性能- 可以重构成一个静态内部类rule.findbugs.STI_INTERRUPTED_ON_=错误- 在thread实例上调用了静态Thread.interrupted()方法_IDIOM_NO_SUPER_=不良实践- clone方法没有调用super.clone()rule.findbugs.VA_FORMAT_STRING_BAD_=错误用法- 格式化字符串占位符与传入的参数不匹配rule.findbugs.EQ_DOESNT_OVERRIDE_=高危- 类没有覆盖父类的equals方法rule.findbugs.BC_IMPOSSIBLE_DOWNCAST_OF_=错误用法- 集合转换为数组元素时发生的类型转换错误rule.findbugs.SE_NO_SUITABLE_CONSTRUCTOR_FOR_=不良实践- 类是可扩展的,但是没有提供无参数的构造方法rule.findbugs.TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SIN =错误用法- 数值需要类型标示,但是却标记为未知rule.findbugs.SIC_INNER_SHOULD_BE_STATIC_NEEDS_=性能- 可以筹够成一个静态内部类rule.findbugs.EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_=不良实践- equals检测不兼容的参数操作rule.findbugs.RV_RETURN_VALUE_OF_PUTIFABSENT_=错误用法- 忽略了putIfAbsent的返回值,传递给putIfAbsent的值被重用rule.findbugs.STCAL_INVOKE_ON_STATIC_CALENDAR_=多线程错误- 调用静态Calendarrule.findbugs.MS_CANNOT_BE_=恶意代码漏洞- 字段不是final的,不能防止恶意代码的攻击rule.findbugs.IS_INCONSISTENT_=多线程错误- 不一致的同步rule.findbugs.SE_NO_=不良实践- 类是可序列化的,但是没有定义serialVersionUIDrule.findbugs.EI_EXPOSE_=恶意代码漏洞- 可能暴露内部实现,通过与可变对象引用协作rule.findbugs.NM_METHOD_CONSTRUCTOR_=错误用法- 明显的方法/构造方法混淆rule.findbugs.ICAST_INTEGER_MULTIPLY_CAST_TO_=高危- 整形乘法的结果转换为long型rule.findbugs.QF_QUESTIONABLE_FOR_=高危- for循环中存在复杂,微妙或者错误的自增rule.findbugs.DLS_DEAD_STORE_OF_CLASS_=错误用法- 类中保存了无用字符rule.findbugs.NM_FUTURE_KEYWORD_USED_AS_MEMBER_=不良实践- 使用了未来java版本中成为关键字的标识rule.findbugs.BC_VACUOUS_=高危- instanceof会一直返回truerule.findbugs.INT_VACUOUS_BIT_=高危- 在整形上进行位操作时有一些位上出现空洞rule.findbugs.NP_NULL_=错误用法- 一个已知的null值被检测它是否是一个类型的实例rule.findbugs.SIC_THREADLOCAL_DEADLY_=错误用法- 非静态内部类和ThreadLocal的致命结合rule.findbugs.EQ_=高危- 罕见的equals方法rule.findbugs.IJU_NO_=错误用法- TestCase没有任何测试rule.findbugs.EQ_OVERRIDING_EQUALS_NOT_=错误用法- equals方法覆盖了父类的equals可能功能不符rule.findbugs.XFB_XML_FACTORY_=高危- 方法直接调用了xml接口的一个具体实现rule.findbugs.SWL_SLEEP_WITH_LOCK_=多线程错误- 方法在获得锁时调用了Thread.sleep()_=不良实践- 类实现了Cloneable ,但是没有定义或使用clone方法rule.findbugs.WA_AWAIT_NOT_IN_=多线程错误- 未在循环中使用的Condition.await()rule.findbugs.DM_FP_NUMBER_=性能- 方法调用了低效的浮点书构造方法;应该使用静态的valueOf代替rule.findbugs.SF_SWITCH_NO_=Switch语句中没有包含defaultrule.findbugs.NP_NULL_ON_SOME_PATH_FROM_RETURN_=高危- 调用返回返回值可能出现null值rule.findbugs.NP_CLONE_COULD_RETURN_=不良实践- Clone方法可能返回nullrule.findbugs.MS_OOI_=恶意代码漏洞- 属性应该从接口中移除并将访问权限设置为包保护rule.findbugs.DM_BOXED_PRIMITIVE_=性能- 方法使用了装箱的基本类型只为了调用toStringrule.findbugs.EQ_ABSTRACT_=不良实践- 抽象类定义了协变的equals方法rule.findbugs.DM_STRING_=性能- 方法调用了String的toString()方法rule.findbugs.SE_METHOD_MUST_BE_=错误用法- 方法必须是private 的为了让序列化正常工作rule.findbugs.DL_SYNCHRONIZATION_ON_=多线程错误- 在Boolean 上使用同步可能导致死锁rule.findbugs.UWF_UNWRITTEN_=错误用法- 未赋值属性rule.findbugs.IS2_INCONSISTENT_=多线程错误- 不一致的同步rule.findbugs.IM_AVERAGE_COMPUTATION_COULD_=高危- 计算平均值可能溢出rule.findbugs.BIT_SIGNED_CHECK_HIGH_=错误用法- 检查位运算的符号rule.findbugs.FL_MATH_USING_FLOAT_=错误用法- 方法进行数学运算时使用了浮点数的精度rule.findbugs.WS_WRITEOBJECT_=多线程错误- 类的writeObject()方法是同步的,但是没有做其他事情rule.findbugs.RV_RETURN_VALUE_=错误用法- 方法忽略了返回值rule.findbugs.SQL_NONCONSTANT_STRING_PASSED_TO_=安全风险- 非常量的字符串传递给方法执行SQL语句rule.findbugs.JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_=不良实践- 不可变的类的属性应该是finalrule.findbugs.AM_CREATES_EMPTY_ZIP_FILE_=不良实践- 创建了一个空的zip文件的入口rule.findbugs.DM_NEXTINT_VIA_=性能- 使用Random的nextInt 方法来获得一个随机整数,而不是nextDoublerule.findbugs.UI_INHERITANCE_UNSAFE_=不良实践- 如果类被扩展,GetResource的使用可能就是不安全的rule.findbugs.SIO_SUPERFLUOUS_=错误用法- 不必要的类型检测使用instanceof操作符rule.findbugs.EQ_OTHER_NO_=错误用法- equals()方法定义,但是没有覆盖equals(Object)M_USELESS_ABSTRACT_=试验- 抽象方法已经在实现的接口中定义了rule.findbugs.MTIA_SUSPECT_SERVLET_INSTANCE_=高危- 扩展Servlet的类使用了实例变量rule.findbugs.DM_USELESS_=多线程错误- 使用默认的空run方法创建了一个线程rule.findbugs.ML_SYNC_ON_UPDATED_=多线程错误- 方法在一个修改了的属性上进行了同步rule.findbugs.CO_SELF_NO_=不良实践- 协变的compareTo()定义rule.findbugs.BC_UNCONFIRMED_=高危- 未检查/未证实的类型转换rule.findbugs.FI_FINALIZER_NULLS_=不良实践- Finalizer空属性rule.findbugs.BIT_=错误用法- 不兼容的位掩码(BIT_AND)rule.findbugs.FE_FLOATING_POINT_=高危- 测试浮点数相等rule.findbugs.TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_NEVER_SINK. name=错误用法- 值不要求有类型标示,但是标记为未知rule.findbugs.NP_NULL_PARAM_=错误用法- 方法调用把null传递给一个非null参数rule.findbugs.FB_MISSING_EXPECTED_=试验- findbugs丢失了期待或需要的警告rule.findbugs.DMI_INVOKING_HASHCODE_ON_=错误用法- 在数组上调用了hashCoderule.findbugs.QBA_QUESTIONABLE_BOOLEAN_=错误用法- 方法在布尔表达式中分配了boolean文字rule.findbugs.SA_FIELD_SELF_=错误用法- 属性自己与自己进行了比较rule.findbugs.UR_UNINIT_READ_CALLED_FROM_SUPER_=错误用法- 父类的构造方法调用未初始化属性的方法rule.findbugs.ES_COMPARING_PARAMETER_STRING_WITH_=不良实践- 比较字符串参数使用了== 或!=rule.findbugs.INT_BAD_COMPARISON_WITH_NONNEGATIVE_=错误用法- 错误比较非负值与负数rule.findbugs.INT_BAD_COMPARISON_WITH_SIGNED_=错误用法- 错误比较带符号的byterule.findbugs.IO_APPENDING_TO_OBJECT_OUTPUT_=错误用法- 尝试向一个对象输出流添加信息rule.findbugs.FI_MISSING_SUPER_=不良实践- Finalizer没有调用父类的finalizerrule.findbugs.VA_FORMAT_STRING_EXTRA_ARGUMENTS_=错误用法- 传递了多余实际使用的格式化字符串的参数rule.findbugs.HE_EQUALS_USE_=不良实践- 类定义了equals(),但使用了Object.hashCode()rule.findbugs.IJU_BAD_SUITE_=错误用法- TestCase声明了一个错误的suite方法rule.findbugs.DMI_CONSTANT_DB_=安全风险- 硬编码了数据库密码rule.findbugs.REC_CATCH_=高危- 捕获了没有抛出的异常rule.findbugs.PS_PUBLIC_=高危- 类在公用接口中暴露了同步和信号rule.findbugs.EC_UNRELATED_=错误用法- 调用equals()比较不同的接口类型rule.findbugs.UCF_USELESS_CONTROL_FLOW_NEXT_=错误用法- 执行到下一行的无用流程控制rule.findbugs.LG_LOST_LOGGER_DUE_TO_WEAK_=试验- OpenJDK中存在潜在的丢失logger的风险,因为弱引用rule.findbugs.NP_UNWRITTEN_=错误用法- 读取未初始化的属性rule.findbugs.DMI_UNSUPPORTED_=高危- 调用不支持的方法rule.findbugs.RCN_REDUNDANT_COMPARISON_OF_NULL_AND_NONNULL_VALUE. name=高危- 重复比较非空值和nullrule.findbugs.EC_BAD_ARRAY_=错误用法- 调用equals(),与==效果一样rule.findbugs.EI_EXPOSE_=恶意代码漏洞- 可能通过返回一个可变对象的引用暴露了内部实现rule.findbugs.NP_DEREFERENCE_OF_READLINE_=高危- 没有判断readLine()的结果是否为空rule.findbugs.UPM_UNCALLED_PRIVATE_=性能- 从未用到的私有方法rule.findbugs.NP_NULL_ON_SOME_=错误用法- 可能出现空指针引用rule.findbugs.NP_EQUALS_SHOULD_HANDLE_NULL_=不良实践- equals()方法没有检测null参数rule.findbugs.EC_NULL_=错误用法- 使用空参数调用equals()rule.findbugs.SE_BAD_FIELD_=不良实践- 非序列化值保存在序列化类的实例变量中rule.findbugs.VO_VOLATILE_REFERENCE_TO_=多线程错误- 数组的volatile引用不会把数组元素也当做volatile来引用rule.findbugs.NP_SYNC_AND_NULL_CHECK_=多线程错误- 同步和空值检测发生在同一个属性上rule.findbugs.DM_=不良实践- 方法调用了System.exit(...)rule.findbugs.RC_REF_=不良实践- 怀疑进行了引用比较rule.findbugs.SE_NO_SUITABLE_=不良实践- 类是可序列化的,但是父类没有定义无参数构造方法rule.findbugs.DC_=多线程错误- 可能对属性进行了双重检测rule.findbugs.DMI_LONG_BITS_TO_DOUBLE_INVOKED_ON_=错误用法- 在int上调用了Double.longBitsToDoublerule.findbugs.RpC_REPEATED_CONDITIONAL_=错误用法- 重复判断条件rule.findbugs.WMI_WRONG_MAP_=性能- keySet迭代是低效的,使用entrySet代替rule.findbugs.DLS_DEAD_LOCAL_=高危- 未用的局部变量rule.findbugs.INT_BAD_REM_BY_=错误用法- 整数剩余模1rule.findbugs.RV_RETURN_VALUE_IGNORED_BAD_=不良实践- 方法忽略异常返回值rule.findbugs.SA_LOCAL_SELF_=高危- 局部变量的自我赋值rule.findbugs.MS_SHOULD_BE_=恶意代码漏洞- 属性不是final,但是应该设置成finalrule.findbugs.SIC_INNER_SHOULD_BE_=性能- 应该是一个静态内部类rule.findbugs.NP_GUARANTEED_=错误用法- null值一定会被调用rule.findbugs.SE_READ_RESOLVE_MUST_RETURN_=不良实践- readResolve方法必须返回Objectrule.findbugs.NP_LOAD_OF_KNOWN_NULL_=高危- 加载了已知的null值rule.findbugs.BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COERCION.na me=性能- 基本数据被装箱又被拆箱_IMPLEMENTS_CLONE_BUT_NOT_=不良实践- 类定义了clone()但没有实现Cloneablerule.findbugs.CO_ABSTRACT_=不良实践- 抽象类定义了协变的compareTo()方法rule.findbugs.BAC_BAD_APPLET_=试验- 错误的Applet构造方法依赖未初始化的AppletStubrule.findbugs.EQ_GETCLASS_AND_CLASS_=不良实践- equals方法因为子类失败rule.findbugs.DB_DUPLICATE_SWITCH_=高危- 在两个switch语句中使用了相同的代码rule.findbugs.DB_DUPLICATE_=高危- 在两个分支中使用了相同的代码rule.findbugs.UOE_USE_OBJECT_=试验- 在final类上调用了equals,但是没有覆盖Object的equals方法rule.findbugs.FI_=不良实践- Finalizer除了调用父类的finalizer以外什么也没做rule.findbugs.NP_ALWAYS_=错误用法- 调用了null指针rule.findbugs.DMI_VACUOUS_SELF_COLLECTION_=错误用法- 集合的调用不能被感知rule.findbugs.DLS_DEAD_LOCAL_STORE_IN_=错误用法- 返回语句中的无用的赋值rule.findbugs.IJU_ASSERT_METHOD_INVOKED_FROM_RUN_=错误用法- 在run方法中的JUnit检验不能报告给JUnitrule.findbugs.DMI_EMPTY_DB_=安全风险- 空的数据库密码rule.findbugs.DM_BOOLEAN_=性能- 方法调用了低效的Boolean构造方法;使用Boolean.valueOf(...)代替rule.findbugs.BC_IMPOSSIBLE_=错误用法- 不可能转型rule.findbugs.BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_=不良实践- Equals方法不应该假设任何有关参数类型的事宜rule.findbugs.RV_EXCEPTION_NOT_=错误用法- 异常创建后就丢弃了,没有抛出rule.findbugs.VA_PRIMITIVE_ARRAY_PASSED_TO_OBJECT_=错误用法- 基本类型数组传递给一个期待可变对象类型参数的方法rule.findbugs.LI_LAZY_INIT_UPDATE_=多线程错误- 错误的延迟初始化和更新静态属性rule.findbugs.SA_FIELD_SELF_=错误用法- 属性自身赋值rule.findbugs.EQ_ALWAYS_=错误用法- equals方法一直返回falserule.findbugs.DMI_RANDOM_USED_ONLY_=不良实践- Random对象创建后只用了一次rule.findbugs.NM_CLASS_NOT_=不良实践- Class没有继承Exception,虽然名字像一个异常rule.findbugs.SA_LOCAL_DOUBLE_=高危- 给局部变量双重赋值rule.findbugs.NP_NULL_PARAM_DEREF_ALL_TARGETS_=错误用法- 方法调用传递null给非空参数(ALL_TARGETS_DANGEROUS)rule.findbugs.NP_TOSTRING_COULD_RETURN_=不良实践- toString方法可能返回nullrule.findbugs.BC_BAD_CAST_TO_ABSTRACT_=高危- 转换成抽象集合值得怀疑rule.findbugs.NM_LCASE_=类定义了hashcode(); 应该是hashCode()吧?rule.findbugs.RU_INVOKE_=多线程错误- 在线程中调用了run(你的意思是再启动一次么?)rule.findbugs.DMI_INVOKING_TOSTRING_ON_=错误用法- 调用了数组的toStringrule.findbugs.NM_METHOD_NAMING_=方法名应该以小写字母开头rule.findbugs.RCN_REDUNDANT_COMPARISON_TWO_NULL_=高危- 重复比较两个null值rule.findbugs.SA_LOCAL_SELF_=错误用法- 对一个变量进行无意义的自我计算(比如x & x)rule.findbugs.MS_MUTABLE_=恶意代码漏洞- 属性是可变的Hashtablerule.findbugs.RV_DONT_JUST_NULL_CHECK_=高危- 方法丢掉了readLine的结果,在检测它是非空之后。

FindBugs1.3.9错误中文说明


o)方法不能对参数 的类型做任何的假设。 equals(Object o)方法不能对参数 o 的类型做任何的假设。 比较此对象与指定的对象。 对象与指定的对象 null, 比较此对象与指定的对象。当且仅当该参数不为 null,并 且是表示与此对象相同的类型的对象时, 类型的对象时 true。 且是表示与此对象相同的类型的对象时,结果才为 true。 4. BC: Random object created and used only once (DMI_RANDOM_USED_ONLY_ONCE) 随机创建对象只使用过一次就抛弃 5. BIT: Check for sign of bitwise operation (BIT_SIGNED_CHECK) 检查位操作符运行是否合理 ((event.detail & SWT.SELECTED) > 0) If SWT.SELECTED is a negative number, this is a candidate for a bug. Even when SWT.SELECTED is not negative, it seems good practice to use '!= 0' instead of '> 0'. 6. CN: Class implements Cloneable but does not define or use clone method (CN_IDIOM) 按照惯例,实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的),以获得有关重写此方法的 详细信息。此接口不 包含 clone 方法。因此,因为某个对 象实现了此接口就克隆它是不可能的,应该实现此接口的类 应该使用公共方法重写 Object.clone 7. CN: clone method does not call super.clone() (CN_IDIOM_NO_SUPER_CALL) 一个非 final 类型的类定义了 clone()方法而没有调用 super.clone()方法。例如:B 扩展自 A,如果 B 中 clone 方 法调用了 spuer.clone(),而 A 中的 clone 没有调用 spuer.clone(),就会造成结果类型不准确。要求 A 的 clone 方法中调用 spuer.clone()方法。 8. CN: Class defines clone() but doesn't implement Cloneable (CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE)

FindBugs使用手册教案资料

文件编号:配置项编号:FindBugs使用手册文档版本号V 1.0农信银资金清算中心创新研发部文档修订记录目录1、FindBugs简介 (3)2、FindBugs的检查规则 (4)2.1Correctness(正确性) (4)2.2 Bad practice(不良实践) (5)2.3 Performance(性能) (5)2.4Multithreaded correctness(多线程正确性) (6)2.5 Dodgy(不可靠) (7)3、FindBugs使用 (8)3.1安装FindBugs (8)3.2配置FindBugs (8)3.3使用FindBugs (8)1、FindBugs简介FindBugs是用于java代码检查的一种静态分析工具,它检查类或者JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。

有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。

FindBugs专注于找出潜在程序错误,而不是编码风格问题,目的在于提高程序的健壮性。

2、FindBugs的检查规则FindBugs提出了超过200种规则,这些规则可主要分为如下类别:2.1Correctness(正确性)这些问题涉及到可能在某些方面不正确的代码。

如:代码有无限递归,或者读取为写入的字段,这类问题几乎无疑是程序的错误。

例1:使用未初始化的类成员,可能导致NullPointException代码:FindBugs检测结果:例2:不使用方法的返回值代码:FindBugs检测结果:2.2Bad practice(不良实践)这类问题明确违反建议的编程标准。

如:删除异常,或未关闭文件,或未数据库连接资源等。

例3:未关闭打开的文件输出流资源代码:FindBugs检测结果:2.3Performance(性能)这类规则的目的在于检测潜在的性能问题。

如:代码创建了不需要的对象,或者在循环中使用字符串连接而不是使用StringBuffer。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

findbugs检测提示详解1、Comparison of String objects using == or !=例,override equals方法时容易犯错if(this.topic != key.getTopic())return false;2、Dead store to newStatusRecord定义局部变量后没有引用3、Invocation of toString on values直接调用数组的toString方法public Query createQuery(String hql, Object values[],Session session){logger.debug(values);logger.debug((newStringBuilder()).append("hql=[").append(hql).append("]").append(((Object)}正确的例子,调用Arrays.toString()和Arrays.deepToString()方法。

import java.util.Arrays;class A{}class B{@Overridepublic String toString() {return "BBBBB";}}public class Test {public static void main(String[] args) {Object [] a = {new Integer(0),new Boolean(true),true,new A(),new B()};Object[][]b ={{new A(),new B()},{new A(),new B()},{new A(),new B()}};System.out.println(Arrays.deepToString(b));}}4、ignores exceptional return value of java.io.File.mkdirs()忽略了返回值,应当含有返回值public void initFolder() {if (!exitDir.isDirectory()) {exitDir.mkdirs();("===Finishing create exit trade image folder!====");}}This method returns a value that is not checked. The return value should be checked since it can indicate an unusual or unexpected function execution. For example, the File.delete() method returns false if the file could not be successfully deleted (rather than throwing an Exception). If you don't check the result, you won't notice if the method invocation signals unexpected behavior by returning an atypical return value.5、不使用new String()定义空的字符串String alarmCodeCond = new String();应当String alarmCodeCond = "";6、invokes inefficient new Short(short) constructor; use Short.valueOf(short) insteadJVM缓存数字常量Short aShort = new Short(12);应当Short aShort = Short.valueOf(12);7、方法命名习惯,首字母小写The method name LaneHandShakeService(Short) doesn't start with a lower case letterMethods should be verbs, in mixed case with the first letter lowercase, with the first letter of each internal word capitalized.8、一个primtive的类型的值经过box后马上unbox Primitive value is boxed then unboxed to perform primitive coercionexitRecord.setEnOperatorId(newLong(transactRecord.getEnoperatorID()).intValue());应当直接强制类型转换exitRecord.setEnOperatorId((int)transactRecord.getEnoperatorID()); 9、Call to equals() comparing different types使用equals()方法比较不同的类,反例StringBuilder builder = new StringBuilder("nihao");String string = "nihao";builder.equals(string);10、Check for oddness that won't work for negative numbers检查奇数的方法:反例if (i % 2 == 1) {//...}The code uses x % 2 == 1 to check to see if a value is odd, but this won't work for negative numbers (e.g., (-5) % 2 == -1). If this code is intending to check for oddness, consider using x & 1 == 1, or x % 2 != 0.11、Load of known null value,null值的不当使用反例:if (devIds == null && devIds.size() == 0) { //... }if (null != tempList || tempList.size() != 0) {//...}if (batchNo == null) {throw new Exception("the No. " + batchNo+ " is not exists!");}12、Method call passes null for nonnull parameter对参数为null的情况没做处理例public void method1() {String ip = null;try {ip = InetAddress.getLocalHost().getHostAddress();} catch (UnknownHostException e) {e.printStackTrace();}long ipCount = countIpAddress(ip); // 可能会传入空引用//... }long countIpAddress(String ip) {long ipNum = 0;String[] ipArray = ip.split("\\.");}修改后:public void method1() {String ip = null;try {ip = InetAddress.getLocalHost().getHostAddress();} catch (UnknownHostException e) {e.printStackTrace();}long ipCount = countIpAddress(ip); // 可能会传入空引用//... }long countIpAddress(String ip) {long ipNum = 0;if (ip == null) {return 0; //或者抛出异常}String[] ipArray = ip.split("\\.");//... }注意:函数入口需要交验入参的合法性。

13、Method concatenates strings using + in a loop在循环里使用字符串连接,效率低,应该使用StringBuilder/StringBuffer例:String writeData = "";for (int i = 0; i < 10; i++) {writeData = writeData + "a";}14、Method may fail to close database resource没有释放数据库资源public ResultSet callProcedure(String procedure) {Session ses = getSessionForUpdate();ResultSet rs = null;try {Connection conn = ses.connection();conn.setAutoCommit(false);CallableStatement statement = conn.prepareCall(procedure); //may fail to close CallableStatementrs = statement.executeQuery();mit();} catch (Exception e) {e.printStackTrace();} finally {try {ses.close();} catch (SQLException e) {throw e;}}return rs;}应当修改为:public ResultSet callProcedure(String procedure) {Session ses = getSessionForUpdate();ResultSet rs = null;CallableStatement statement = null;try {Connection conn = ses.connection();conn.setAutoCommit(false);statement = conn.prepareCall(procedure);rs = statement.executeQuery();mit();} catch (Exception e) {e.printStackTrace();} finally {try {statement.close();ses.close();} catch (SQLException e) {e.printStackTrace();}}return rs;}15、Method may fail to close stream没有关闭流,可能会导致文件描述符泄露,应该在finally中关闭例:try {FileInputStream in = new FileInputStream(file);InputStreamReader inputStreamReader = new InputStreamReader(in);BufferedReader reader = new BufferedReader(inputStreamReader);//...in.close();inputStreamReader.close();reader.close();} catch (IOException e) {修改为:FileInputStream in = null;InputStreamReader inputStreamReader = null;BufferedReader reader = null;try {in = new FileInputStream(file);inputStreamReader = new InputStreamReader(in);reader = new BufferedReader(inputStreamReader);// ...} catch (IOException e) {} finally {try {in.close();} catch (IOException e) {e.printStackTrace();}try {inputStreamReader.close();} catch (IOException e) {e.printStackTrace();}try {reader.close();} catch (IOException e) {e.printStackTrace();}}16、Method might ignore exceptionThis method might ignore an exception. In general, exceptions should be handled or reported in some way, or they should be thrown out of the method.应该将异常处理、打印或者抛出反例://...} catch (Exception e) {}17、Class defines non-transient non-serializable instance field readerTypeInfo一个实现了Serializable接口的类,含有非transient 和非serializable 的实例对象域。

相关文档
最新文档