FindBugs安装及使用说明
- 格式:doc
- 大小:606.00 KB
- 文档页数:18
Product name产品名称Confidentiality level密级FindBugs帮助文档内部公开Product version产品版本Total 29 pages 共29页V1.0FindBugs帮助文档(软件工程部)Prepared by拟制邓爱平36829Date日期2008-10-16Reviewed by 审核人Date 日期Reviewed by 审核人Date 日期Authorized by批准Date日期Huawei Technologies Co., Ltd.华为技术有限公司All rights reserved版权所有侵权必究文档版本 1.1 (2006-03-01) 华为技术有限公司1-1文档版本 1.1 (2006-03-01) 华为技术有限公司1-2修订记录日期文档版本产品版本描述作者2008-10-16 1.0 初稿邓爱平36829文档版本 1.1 (2006-03-01) 华为技术有限公司1-3目录(Contents)1 目的和范围................................................................................................................................... 1-61.1 目的 .............................................................................................................................................. 1-61.2 范围 .............................................................................................................................................. 1-62 FindBugs使用 .............................................................................................................................. 2-62.1 FindBugs简介................................................................................................................................ 2-62.1.1 FindBugs能解决的问题......................................................................................................... 2-62.1.2 同类产品介绍 ....................................................................................................................... 2-92.2 如何安装FindBugs ........................................................................................................................ 2-92.2.1 图形界面/命令行................................................................................................................... 2-92.2.2 安装Eclipse插件................................................................................................................... 2-92.3 如何使用FindBugs ...................................................................................................................... 2-122.3.1 在图形界面下使用FindBugs(JDK1.5上进行)...................................................................... 2-122.3.2 在命令行下使用FindBugs .................................................................................................. 2-152.3.3 在Eclipse下使用FindBugs .................................................................................................. 2-172.3.4 通过ant任务脚本使用FindBugs .......................................................................................... 2-202.4 FindBugs的高级功能................................................................................................................... 2-222.4.1 规则配置............................................................................................................................. 2-222.4.2 使用过滤器......................................................................................................................... 2-222.4.3 FindBugs的局限性.............................................................................................................. 2-232.4.4 FindBugs推行细则.............................................................................................................. 2-243 常见问题FAQ及其解答............................................................................................................ 3-243.1 在Eclipse下在更改了检查出的错误后,为什么无法实时刷新检查结果 ...................................... 3-243.2 在Eclipse下使用FindBugs时,如何将发现的问题显示在Problems视图中................................. 3-243.3 为什么Eclipse插件加载不成功.................................................................................................... 3-253.4 如何配置FindBugs的通过准则.................................................................................................... 3-253.5 为什么在图形界面下使用FindBugs时,关联不到源代码............................................................ 3-253.6 文档胶片中说到的FindBugs帮助文档在什么地方....................................................................... 3-263.7 到什么地方获取FindBugs相关资料............................................................................................. 3-263.8 对于不修改的Bug,怎么给出原因说明....................................................................................... 3-263.9 Findbugs占用大量内存,而且运行时间很长,应该如何缩短运行时间.................................... 3-27文档版本 1.1 (2006-03-01) 华为技术有限公司1-43.10 每个工程目录下的.fbprefs 文件有何作用................................................................................. 3-273.11 Bug Explorer窗口的export有何功能 .......................................................................................... 3-283.12 如何了解findbugs提供的每个规则的含义 ................................................................................. 3-284 参考引用..................................................................................................................................... 4-28文档版本 1.1 (2006-03-01) 华为技术有限公司1-51 目的和范围1.1 目的FindBugs 是一个代码静态分析工具,它检查类或者JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。
CheckStyle 、FindBugs和PMD 一、三个插件的安装方法一:1.Eclipse中,选择Help->Install New Software2.点击Add来新增一个安装3.输入安装名称和地址a)CheckStyle:/projects/eclipsecs/files/updatesite/5.6.0/b)Findbugs:/eclipsec)PMD:/projects/pmd/files/pmdeclipse/update-site-latest/如果安装地址不对,会报错,如下图:如果安装地址正确,如下:4. 安装后重启即可5.安装好之后,右击项目选择属性,可以看到安装是否成功方法二:1.下载eclipse插件下载后,把里面的两个文件夹plugins和 features下面的文件分别拷贝到eclipse目录下面对应的plugins和features目录2.如果你就这样直接启动eclipse 可能会出现ClassNotFoundExceptions 等错误,所以必须在启动eclipse的时候加上一个参数 -clean. 这样eclipse就可以更新它当前安装的许多插件信息比如你得eclipse在d盘那么就是 d:\eclipse\eclipse.exe -clean二、CheckStyle的介绍和使用1、介绍Checkstyle是一款检查java程序代码样式的工具,可以有效的帮助我们检视代码以便更好的遵循代码编写标准,特别适用于小组开发时彼此间的样式规范和统一。
Checkstyle提供了高可配置性,以便适用于各种代码规范,所以除了可以使用它提供的sun的代码标准外,你也可以定制自己的标准。
我们可以在eclipse中安装checkstyle的插件,来方便我们的使用。
Checkstyle可以让我们养成书写良好代码风格的习惯,代码的整洁也减少了很多bad smell的产生。
使用checkstyle的过程中可能需要经常的调整配置文件,有些check过于严格,可以根据实际情况取消一些代码检查。
Findbugs在eclipse中的安装及使用
1Findbugs插件安装与使用
1.1插件安装
1)点击eclipse菜单栏Help->Eclipse Marketplace搜索关键字findbugs,搜索到插件并点击安装即可,如下图:
2)安装完毕后,点击重启eclipse
1.2使用
1)添加findbugs explorer:选择window->show view->other,选择Bug Exploer,点击“ok”
2)选择要检查的项目,选择project->Build project进行编译
3)选择整个项目或者选择指定的包或者类进行findbug:右键,选择Find Bugs->Find Bugs (之前最好先Clear Bug Markers),此时findbugs会遍历指定的包或者类,进行分析,找出代码bug,然后集中显示在find bugs的bugs explorer 中。
4)在Bug Explorer中能看到检查出来的bug,双击bug就可以在编辑窗口自动打开相关代
码文件并连接到代码片段。
1.3Bug说明
找出的bug有3中颜色,黑色的臭虫标志是分类,红色的臭虫表示严重bug发现后必须修改代码,橘黄色的臭虫表示潜在警告性bug 尽量修改。
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篇——让⼯具找出你代码中的bug 前⾔转载请声明,转⾃【】,谢谢!项⽬中代码质量,往往需要⽐较有经验的程序员的审查来保证。
但是随着项⽬越来越⼤,代码审查会变得越来越复杂,需要耗费越来越多的⼈⼒。
⽽且程序员的经验和精⼒都是有限的,能审查出问题必定有限。
⽽在对代码质量要求越来越严格的当今IT界,这⽆疑是个⽭盾点。
幸运的是,不少公司发布了代码扫描⼯具,来检测代码中存在的问题。
尽管它们⽆法扫描出所有的bug,但仍然能够为我们的⼯作带来极⼤的便利。
其中FindBugs就是这其中的佼佼者,本⽂将结合Android Studio 来介绍该⼯具的使⽤。
⼀、FindBugs简介FindBugs是⼀款Java缺陷检测⼯具,它通过分析静态字节码可以查找出200多种错误模式,例如空指针取消引⽤、⽆限递归循环、Java库的错误使⽤和死锁等。
⼆、安装FindBugs插件Android Studio默认是没有安装FindBugs插件的,需要我们⾃⼰进⾏安装。
所幸Android Studio提供了丰富的插件,可以直接从库插件库中进⾏安装。
当然也可以⾃⼰⼿动从⽹上下载好该插件,然后安装。
这⾥将两种⽅法都简单介绍⼀下。
1、从Android Studio插件库中安装点击⾯板中主菜单Files > Settings > Plugs 就可以进⼊到插件中⼼,如下图所⽰:②处可以输⼊要查找的插件名,如果安装了,并满⾜③处筛选条件,会显⽰在④处列表中。
③处选择筛选范围,④处⽤于显⽰在②处和③处所指定条件下查询到的插件列表,右边的选择框可选中表⽰该插件可以⽤,否则表⽰不可⽤。
⑤处显⽰选择的插件的相关信息⑥处是⼀个⼊⼝,可以跳转去安装JetBrains提供的插件。
⑦处⽤于跳转到从仓库中浏览并安装插件。
⑧处⽤于安转下载到本地的插件。
这⾥我们选择从“Browse Repositories”进⼊安装,进⼊后搜索“FindBugs”会显⽰如下界⾯,我们选择“FindBugs-IDEA”进⾏安装。
ideafindbugs使用"IdeaFindBugs" 是一款由 JetBrains 开发的 Java 代码发现工具。
它可以帮助您在编写代码时自动发现代码中的潜在问题,并提供解决方案。
以下是一些使用 IDEAFindBugs 的技巧:1. 启动 IDEAFindBugs:在 IDEA 中,选择 "File" -> "Open Project",然后选择您要打开的项目,最后选择 "Ignored Files" 文件夹,然后选择 " IDEAFindBugs" 插件并启用它。
2. 配置 IDEAFindBugs:在 IDEA 中,选择 "Window" -> " preferences",然后选择 "Maven/Gradle" 类别,在 "Maven Repositories" 页面中添加您的 Maven 仓库。
3. 设置 IDEAFindBugs 检查参数:在 IDEA 中,选择 "File" -> " Settings",然后选择 "Maven/Gradle" 类别,在 "Maven" 页面中选中 "Use Maven settings file" 选项,并设置 "Maven home" 路径。
4. 启用 IDEAFindBugs 自动补全:在 IDEA 中,选择"Language" -> "Java" 选项卡,然后选择 "Assist" 菜单,在 "Code Assist" 页面中启用 IDEAFindBugs 自动补全。
开源⼯具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):关注于同步和多线程问题。
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用法FindBugs是一款由加州大学伯克利分校的Java开发者团队开发的静态代码分析工具,主要用于发现Java代码中的潜在错误和漏洞。
本文将向您介绍FindBugs的基本用法,帮助您更好地利用这款工具提高代码质量。
一、FindBugs简介FindBugs是一款免费的开源工具,它通过分析Java代码的语法、数据流、异常处理等方面,发现潜在的错误和漏洞。
FindBugs可以帮助开发者发现一些不易被人工发现的错误,提高代码质量,减少软件缺陷。
二、安装FindBugs要使用FindBugs,您需要先将其安装到您的系统中。
FindBugs支持Windows、Linux和MacOSX等操作系统。
安装过程相对简单,您可以从FindBugs官方网站下载最新版本的FindBugs,并根据安装指南进行安装。
三、使用FindBugs进行代码分析安装完成后,您可以使用FindBugs对Java代码进行静态分析。
以下是使用FindBugs进行代码分析的基本步骤:1.打开FindBugs分析器界面,将要分析的Java代码文件上传到分析器中。
2.选择要进行静态分析的选项,如是否包含测试代码等。
3.等待分析器进行分析,生成报告。
4.查看分析报告,了解代码中的潜在错误和漏洞。
以下是一些使用FindBugs的常见用法示例:1.查找未使用的变量:FindBugs可以检测到未使用的变量,这可能是由于开发者疏忽或无意中留下的漏洞。
2.查找空指针引用:FindBugs可以检测到可能出现的空指针引用错误,这可能导致程序崩溃或出现不可预期的行为。
3.查找内存泄漏:FindBbugs可以检测到可能的内存泄漏问题,如对象引用未被释放等。
4.查找线程安全问题:FindBugs可以检测到线程安全问题,如并发修改共享数据等。
五、优化FindBugs结果使用FindBugs分析后,您可能会发现一些潜在的问题和漏洞。
对于这些问题和漏洞,您可以采取以下优化措施:1.修复错误:对于发现的错误和漏洞,您应该尽快修复它们,以确保代码的质量和稳定性。
sonarqube findbugs 实现原理SonarQube FindBugs 是一个开源的代码静态分析工具,它主要用于在 Java 代码中找出潜在的错误和漏洞。
FindBugs 使用静态分析技术对代码进行扫描,不需要运行时环境,也不需要编译后的字节码。
它基于字节码分析技术,通过对类文件(.class 文件)进行分析,以发现代码中的错误。
以下是 SonarQube FindBugs 实现原理的详细说明:一、下载和安装首先,需要从 SonarQube 官网下载 FindBugs 的 ZIP 文件,并解压到适当的位置。
然后,通过配置 SonarQube 的启动脚本(例如StartSonar.bat),将 FindBugs 集成到 SonarQube 中。
二、架构和组成FindBugs 的架构包括三个主要组件:FindBugs UI、FindBugs Plugin 和 FindBugs Engine。
FindBugs UI 用于展示分析结果和错误信息,FindBugs Plugin 是将 FindBugs 集成到 SonarQube 中的插件,FindBugs Engine 是执行实际分析的引擎。
三、工作原理FindBugs 使用静态分析技术对 Java 代码进行扫描。
它通过读取类文件(.class 文件)中的字节码信息,分析其中的指令和数据流,以发现潜在的错误和漏洞。
FindBugs 使用一组规则(称为检查器)来检查代码中的问题。
这些规则涵盖了常见的编程错误和安全漏洞,例如空指针异常、资源泄露、数据竞争等。
四、检查器的工作方式FindBugs 使用了一种称为“静态单赋值”(SSA)的中间表示形式来分析代码。
在这种表示形式中,每个变量只有一个赋值点,这有助于提高分析的精度。
FindBugs 通过遍历代码中的每个节点,对每个节点的操作进行静态单赋值分析,以确定可能存在的问题。
五、结果展示FindBugs 分析完成后,将结果展示在 SonarQube UI 中。
FindBug安装及使用说明目录1.简介 (3)1.1说明 (3)1.2环境要求 (3)1.3注意事项 (3)2.FINDBUGS安装 (3)2.1在线安装 (3)2.2离线安装 (9)3.FINDBUGS使用 (9)3.1F IND B UGS操作 (10)3.2F IND B UGS常见故障模式 (11)3.2.1Cloneable Not Implemented Correctly (CN) (11)3.2.2Double Checked Locking (DC) (11)3.2.3Dropped Exception (DE) (12)3.2.4Suspicious Equals Comparison (EC) (12)3.2.5Bad Covariant Definition of Equals (Eq) (12)3.2.6Equal Objects Must Have Equal Hashcodes (HE) (13)3.2.7Static Field Modifiable By Untrusted Code (MS) (13)3.2.8Null Pointer Dereference (NP), Redundant Comparison to Null (RCN) (14)3.2.9Non-Short-Circuit Boolean Operator (NS) (14)3.2.10Open Stream (15)3.2.11Read Return Should Be Checked (RR) (15)3.2.12Return Value Should Be Checked (RV) (16)3.2.13Non-serializable Serializable class (SE) (16)3.2.14Uninitialized Read In Constructor (UR) (16)3.2.15Unconditional Wait (UW) (17)3.2.16Wait Not In Loop (Wa) (17)4.修订记录 (18)1.简介1.1说明FindBugs 是一个java bytecode静态分析工具,它可以帮助java工程师提高代码质量以及排除隐含的缺陷。
FindBugs检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。
有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。
FindBugs 不是通过分析类文件的形式或结构来确定程序的意图,而是通常使用 Visitor 模式进行分析。
(Visitor 模式的更多信息)1.2环境要求使用FindBugs至少需要JDK1.4.0以上版本,FindBugs是平台独立的,可以运行于GNU/Linux、Windows、MacOS X 等平台上。
运行FindBugs至少需要有256 MB内存,如果你要分析一个很大的项目,那就需要更加多的内存。
1.3注意事项本文部分内容来自网络,如有错误或不当之处请指出,谢谢。
2. FindBugs安装2.1在线安装使用Eclipse/MyEclipse的Help→Software Updates→Find and Install以插件形式在线安装FindBugs。
请安装的同学注意网络是否正常,建议17:00-19:00时间段操作。
图2-1-1 查找新的插件进行安装图2-1-2 新建findbugs的远程站点图2-1-3 勾选配置的站点,完成开始远程下载最新的FindBugs插件包图2-1-4 勾选下载的插件包,进行下一步图2-1-5 勾选接受选项,进行下一步图2-1-6 选择完成,进行FindBugs插件安装2.2离线安装请到/downloads.html下载Eclipse plugin for FindBugs,目前版本为1.3.9.20090821 。
将下载的edu.umd.cs.findbugs.plugin.eclipse_1.3.9.20090821.zip文件解压到Eclipse 的plugins子目录中,重新启动Eclipse即可。
3.FindBugs使用3.1 FindBugs操作图3-1-1 选择检查的内容,右键Find Bugs开始进行代码检查图3-1-2 检查完毕切换到FindBugs透视图查看Bug条目3.2 FindBugs常见故障模式3.2.1Cloneable Not Implemented Correctly (CN)这种模式检查类是否正确实现了Cloneable接口。
最常见的错误是调用构造函数分配一个新对象,而不是调用super.clone()。
这就导致无法正常地从类继承子类,因为从子类中调用clone 不会返回其类型的实例。
3.2.2Double Checked Locking (DC)两次检查对象是否为空来保证同步仅对顺序一致性内存模型有效,关于DCL已不再有效的声明发表在/users/pugh/java/memoryModel/DoubleCheckedLocking.html // Correct multithreaded versionclass Foo {private Helper helper = null;public synchronized Helper getHelper() {if (helper == null)helper = new Helper();return helper;}// other functions and members...}为了避免在helper已被分配后仍需要同步,提出了DCL,如下public Helper getHelper() {if (helper == null)synchronized(this) {if (helper == null) helper = new Helper();}return helper;}但这段代码在编译器优化或者共享内存的多处理器上却会出现问题。
最主要的原因就是new Helper方法进行的初始化和向helper中的写入是可以乱序执行的。
因此一个线程可能会访问到helper对象,但是helper对象里是默认的初始化值,而非通过构造函数指定。
在java内存模型中,要修正这个故障很容易,只要将helper声明为volatile即可。
代码如下:class Foo {private volatile Helper helper = null;public Helper getHelper() {if (helper == null) {synchronized(this) {if (helper == null)helper = new Helper();}} return helper;}}3.2.3Dropped Exception (DE)这个检测器查找try-catch块中,catch语句内容为空,异常被忽略。
这种情况的出现是因为程序员认为该种异常不会出现,但是实际执行中一旦出现该异常,就会导致相当严重的后果。
3.2.4Suspicious Equals Comparison (EC)该检测器使用intraprocedural dataflow analysis以确定两个已知不可比较的对象使用了equals()方法进行了比较。
这样的比较应一直返回false,并且往往是由于比较了错误的对象,才导致出现该故障。
3.2.5Bad Covariant Definition of Equals (Eq)Java类可能会覆盖equals(Object)方法来定义对象是否等同。
编程者有时会使用自己的类作为equals()函数的参数。
如:public boolean equals(Foo obj) {...}这样的equals变种并没有覆盖Object中的equals方法,就会导致运行时所不期望的行为,尤其是当该类和标准类集合中的类混合使用时,标准类期望equals(Object)被正确覆盖。
这种bug不易发现,因为当该类以类的引用方式(而不是超类)访问时,不会发生任何错误。
3.2.6Equal Objects Must Have Equal Hashcodes (HE)Java对象要能够保存在HashMaps和HashSets中,就要同时实现equals(Object)和hashCode()方法。
其中很重要的隐含规则就是:经比较相等的对象必须具有相同的hashcode。
考虑下面一种情况,有一个类覆盖了equals方法,但没有覆盖hashCode()方法。
而Object类中缺省实现的hashCode()返回一个由java虚拟机随机分配的一个值。
这样就可能会导致该类的两个对象equal,但具有不同的hashcode.由于hashcode不同,它们就会被分配到不同的buckets,从而使得在同一hash数据结构中含有两个相同(equal)的对象,违反了HashMap和HashSet的规定。
3.2.7Static Field Modifiable By Untrusted Code (MS)这种bug主要针对的情况为不可信的代码被允许修改static数据,因此就修改了影响所有用户的库的行为。
下面是几种不当授权可能发生的情况:Static但不是final的数据允许public或者protected的访问Static final的数据允许public或者protected的访问,并且引用到一个可变(更)结构,如数组或者Hashtable一个方法返回的引用指向static但可变更的数据结构如数据或者Hashtable。
这种故障主要是由于对static所起作用假设不当引起的,static成员的作用是允许独立于类的任何对象使用,无需一个特殊的实例,往往关乎全局的设置。
但该数据是否可以修改则未作限制。
上述第一种情况是显而易见的,未声明为final的成员允许public访问,就打开了不可信代码向对象实施变更的大门。
后两种情况也类似,均是允许对自身进行修改造成漏洞。
值得注意的是第二种情况,虽然声明了final,但它的引用却指向一个可变结构,本质上仍允许修改。
3.2.8Null Pointer Dereference (NP), Redundant Comparison to Null (RCN)使用空指针调用函数或者访问变量会导致NullPointerException。
探测器使用严格的过程内数据流分析,并且将if语句考虑在内,如if(foo == null){…}, 那么探测器就知道foo在if语句体内为空。