还不会用FindBugs?你的代码质量很可能令人堪忧
摘自:https://www.cnblogs.com/andy-songwei/p/11820564.html
前言
转载请声明,转自【https://www.cnblogs.com/andy-songwei/p/11820564.html】,谢谢!
项目中代码质量,往往需要比较有经验的程序员的审查来保证。但是随着项目越来越大,代码审查会变得越来越复杂,需要耗费越来越多的人力。而且程序员的经验和精力都是有限的,能审查出问题必定有限。而在对代码质量要求越来越严格的当今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”进行安装。(我这里是已经安装过了,如果没有安装,右边会显示“install”按钮。)
安装完成后,返回到Plugs主面板,搜索“FindBugs”就会显示如下界面,如果不想用了,可以点击“Uninstall”来卸载。
当安装完成后,会提示重启AS,重启动后即可使用了。
2、从磁盘安装
首先手动下载该插件,这里提供下一个链接:https://pan.baidu.com/s/1qbtsnCby-xpmbC9jBdfMSg ,提取码:fuae。
仍然是从上述的插件面板中操作,选择第⑧点击“Install plugin from disk”后选择下载好的插件,按照提示操作即可。
三、FindBugs的启动
安装成功后,有两种方式可以启动FindBugs的分析功能。
1、从控制面板中启动
在AS界面的左下角有个“FindBugs-IDEA”按钮,如下图红框所示,通过点击该按钮,可以调起工具窗口面板,通过该窗口可以开始启动分析(工具窗口面板及其使用,后面会介绍)。
2、通过右键菜单启动
在AS界面点击右键,在弹出的菜单栏中可以看到“FindBugs”选项,子菜单栏中可以选择要分析的文件范围(AS的不同区域点击右键,“FindBugs”选项的位置和子菜单也会略有不同)。
四、FindBugs的基本使用
分析完成后,默认会显示如下界面。这里对该面板各个区域进行介绍。
1、工具窗口
该区域提供了众多的选项,可以方便设置分析范围和展示分析结果。
这里对其中几项再详细进行说明。
(1)bug的类型
按照第12点根据bug类型分组后,会显示如下界面:
当前模块分析结果只展示了部分类型的bug,实际上FindBugs可以展示9中类型:
1)Bad practice
不好的实践。比如不规范的类、方法、变量的命名;调用有返回值的方法时没有正确使用返回值等。
2)Dodgy code
可疑的代码。比如使用switch/case语法,没有使用default;数据计算后的精度丢失等。
3)Malicious code vulnerability
恶意的代码漏洞,如果代码公开,可能导致恶意的修改和攻击。比如该使用final修改的常量没有使用final,导致该常量可能被修改;该使用protected修饰的,却使用public修饰,这不利于对成员的保护;
4)Correctness
正确性问题,不正确使用会导致报错。比如该判断空指针的地方没有判空,这会导致空指针异常;构造函数中使用了没有复制的变量,如果使用时对该变量有判空,该语句不会执行,而如果没有判空,则会报空指针异常。
5)Performance
性能问题。比如定义了某些变量却从未被读取过;定义的变量从未被使用过等,在执行过程中会占用空间和时间,建议删掉;内部类应该加上static修饰符;可以采用更高效的函数来实现功能等。
6)Multithreaded correctness
多线程正确性,主要是多线程环境下线程安全问题。比如volatile的不正确使用;该使用syncronized关键字的地方没有使用等。
7)Experimental
实验。
8)Security
安全性问题。要扫描到安全方面的bug,需要在设置>FindBugs-IDEA >General > Plugins中添加Find Security Bugs插件。这里主要聚焦于安全方面的问题,比如向sdcard等存储卡中写数据,其中可能包含私人信息;写入sdcard等存储器数据容易被其它程序读取;使用的加密算法不够安全等。
9)Internationalization(I18N)
国际化问题。比如字符串与字节相互转换时的字符集问题等,有些地方需要显示指定字符集,因为不同平台或语言使用的字符集有差异。
这里仅对这几个大类简单的介绍,由于能检测到的错误项非常多,无法一一举例。在实际使用过程中,可以查看具体项,根据提示来解决问题。当然,有些问题,FindBugs报出来了,但我们实际工作中可能想忽略掉,不希望被检测,可以在设置中选择要分析的项,后面会介绍该设置项。
(2)Bug的严重级别
第15点中,按照bug严重级别进行排列,分析结果会以如下形式展示,每一项点击后可以查看更详细的列表:
其严重级别分为分为如下4个等级:
1)Of Concren 建议, 如果遵循能更好的完善代码
2)Troubling 不好的, 可能会引发不良后果
3)Scary 严重问题, 在某种情况下一定会出现问题
4)Scariest 非常严重, 已经影响到当前程序功能
(3)设置
进入到FindBugs的高阶设置面板。
2、分析结果显示区
以树状结构展示分析后的结果,可以通过工具窗口中的选择,来决定该区域是展开还是关闭,以什么对结果进行分组,需要显示哪些内容等。
3、bug预览区
当选择具体某一个bug时,此处会显示问题点所在的上下文环境。
4、bug详情区
这部分展示了选中的bug的详细信息,比如所在的类,方法,有问题的字段,当期bug是什么样的问题,为什么需要修改,修改建议等。
五、FindBugs的高阶使用
控制面板中提供了“设置”入口,从这个入口可以配置FindBlugs的一些更高阶的用法。比如添加安全相关问题的扫描,过滤哪些文件不扫描,设置报告文档中不包含那些问题项等。这一节介绍其中比较常用的一些功能点。该设置面板的路径为:设置 > FindBugs-IDEA。
1、General
这一栏总共有六项
(1)Compile affected files before analyze 在分析之前进行编译
(2)Analyze affected files affter comlplie 在变动的文件编译之后分析
(3)Analyze affected files after auto make 在自动Make之后分析变动的文件 自动
(4)Run analyze in background 在后台分析,不显示进度条窗口
(5) Active toolwindow on run
(6)Plugins
这部分可以再添加一些加强FindBugs功能的插件,前面提到过的“Security”,就需要用到这里的“find Security Bugs”插件来扫描。
2、Report
这一项中有多个选项,用于选择报告文件中要包含的内容。
3、Filter
过滤器,用于过滤哪些文件需要扫描,哪些不用扫描。
4、Detector
用于配置检测器列表,选中的检测器将参与到扫描中。
5、Annotate
注解相关的设置,这一部分均选择默认即可。
6、Share
共享设置文件,一般可以忽略。
结语
本文只介绍了FindBugs常见的一些使用方法,一定还有很多很牛的功能,希望读者们多多探索,多多交流,共同进步,谢谢!