findbugs 简介
- findBugs是一个静态分析工具,它检查类或者jar文件,将字节码与一组缺陷模式进行对比以发现可能的问题,有了静态分析工具,就可以在不实际运行程序的情况下对软件进行分析,不是通过分析类文件的形式或者结构来确定程序的意图,而是通过使用Visitor模式,发现潜在问题。
- FindBugs原理是分析编译后的class文件,也就是字节码文件。我们需要了解FindBugs底层的处理机制。根据FindBugs官网文档描述,FindBugs使用了BCEL来分析Java字节码文件。从1.1版本开始,FindBugs也支持使用ASM字节码框架来编写bug探测器。
- findBugs中定义了很多检测器:比如检测hash equals不匹配、忽略方法返回值等等,我们也可以自己定义一个检测器。
下载findbugs源码
- 去findBugs官网下载findbugs-3.0.1.zip 和 findbugs-3.0.1-source.zip(当前版本是3.0.1)
- findbugs-3.0.1.zip放的是可执行文件,其中lib下面有个findbugs.jar, 我们自定义规则编译jar要替换它。
- findbugs-3.0.1-source.zip是源码文件。
定义一个检测器
- 我们以Android代码中不能使用System.out.println打印日志为例,来写一个检测器。直接上代码吧,通过代码可以大致掌握findBugs的规则怎么写。
待检测代码
|
|
对应的字节码
- 用Intellij IDEA编写代码,它自带了一个ByteCodeViewer,可以通过View—Show ByteCode显示class字节码:
|
|
- 通过查看字节码,我们能找出关键信息
|
|
编写探测器
- 将上面下载的findbugs-3.0.1-source.zip解压之后,导入Intellij idea中,然后开始写我们的探测器(在/src/java/目录下),我在代码中已经详细的注释:
|
|
将规则加入规则文件中
- 规则文件findbugs在(/etc/目录下)
|
|
- 配置message.xml,message.xml主要是配置检测到错误时展示的信息
|
|
编译jar
在findbugs根目录运行
1mvn clean install -Dmaven.test.skip=true运行的jar在/target/目录下。
进行静态代码扫描
- 将上面编译的jar拷贝到上面提到的/lib目录下,然后运行命令(最好将findbugs.bat配置到PATH中)
|
|
- 这里的outputfile是html,也可以用xml。
得到的结果,如下图所示:
可以看到有2个waring,详细信息可以去ff.html中查看, 看看是不是自己定义的错误信息。
总结
- 上面大致讲解了findbugs的规则是怎么编写的,大家可以依葫芦画瓢,针对自己的业务,编写自己的探测器。