Findbugs是一款开源的java源码静态分析工具,用来在不运行程序的情况发现程序潜在的bug,它通过分析jar包或classes文件来实现。
Fingbugs支持GUI、命令行、ant、插件等多种形式的运行方式,这里以命令行和Ant两种形式来介绍工具的基本使用。
前提条件
已安装JDK,本文使用java version "1.8.0_202";
已下载FindBugs工具,解压并添加到环境变量,下载链接http://findbugs.sourceforge.net/;
已下载Apache Ant工具,解压并添加到环境变量,并将FindBugs工具lib目录中的findbugs-ant.jar复制到Ant的lib目录;
命令行方式
findbugs -textui -maxHeap 2048 -include filterFile.xml -html:fancy.xsl -output findbugs.html ./target/demo-1.0.0.jar
-textui 表示非gui模式
-maxHeap 指定最大堆内存,FindBugs运行比较消耗内存,建议配置大一些
-include 表示只有filterFile.xml匹配的内容才会上报bug,其中filterFile.xml的内容如下
<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
<Match>
<!-- 匹配包含demo的类 -->
<Class name="~.*demo.*" />
</Match>
</FindBugsFilter>
-html:fancy.xsl 指定使用fancy.xsl模板生成html报告,该模板界面相对比较友好
-output 指定报告输出的路径及文件名
./target/demo-1.0.0.jar 表示分析的jar包,也可以指定classes路径
生成的html报告样例
Ant方式
使用Ant方式运行首先需要创建build.xml文件
<?xml version="1.0" ?>
<project name="findbugs">
<property name="findbugs.home" value="C:/工具/安全/findbugs-3.0.1" />
<taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask" />
<target name="findbugs">
<findbugs home="${findbugs.home}" jvmargs="-Xmx2048m"
output="html"
outputFile="findbugs.html"
excludeFilter="${basedir}/findbugs-exclude.xml">
<!-- <auxClasspath path="${basedir}/lib/Regex.jar" /> -->
<sourcePath path="${basedir}/src/main/java" />
<class location="${basedir}/target/demo-1.0.0.jar" />
</findbugs>
</target>
</project>
findbugs.home表示FindBugs工具的路径,需要根据实际情况修改value的值;
jvmargs设置findbugs任务使用的最大堆内存;
output设置输出报告的文件格式;
outputFile设置输出报告的路径和文件名;
excludeFilter表示排除(即匹配的内容不上报bug),通过findbugs-exclude.xml文件配置,其中${basedir}表示ant命令执行所在的路径,排除findbugs-exclude.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
<Match>
<!-- 通过正则方式匹配,匹配不包含demo的类 -->
<Class name="~.*^(demo).*" />
</Match>
</FindBugsFilter>
sourcePath指定分析的源码路径,比如类的形式为com.*,则源码的路径必须为com目录所在的路径,否则生成的xml报告查看时不会显示源码;
class指定分析的jar包或者classes路径;
auxClasspath指定辅助类,如果有的话需要指定,可选项。
cd到build.xml所在路径执行ant findbugs命令就会开始执行,如果项目比较大执行会比较耗时,十几分钟都是有可能的,只要运行没有报错就耐心等待直到生成报告。
FindBus报告分析
FindBugs把bug分成了下面几个大类
Bad practice/不好的实践
Correctness/正确性
Experimental/实验性
Internationalization/国际化
Malicious code vulnerability/恶意代码漏洞
Multithreaded correctness/多线程正确性
Performance/性能
Security/安全
Dodgy code/糟糕的代码
详细的bug描述可以访问
http://findbugs.sourceforge.net/bugDescriptions.html进行查看
以生成的HTML报告为例,List bugs by bug category页签可以按照bug的类别进行查看,展开其中的某个bug,可以看到bug所属的类别、bug所在的类及其属性或方法、bug所在的代码文件名及行数。
如果不清楚为什么上报了此bug,可以通过bug描述到上面提到的bug描述页面中搜索看到详细的解释。
项目包含多个jar包怎么办?
上面介绍的运行方式都是针对单个jar包,如果项目包含多个jar包且jar包分散在多个不同的目录,可以使用rejarForAnalysis脚本,该脚本在FindBugs工具的bin目录下,linux下运行需要给rejarForAnalysis脚本添加可执行权限。
使用rejarForAnalysis脚本的目的就是把分散的多个jar包整合成一个更大的jar包,它需要和shell命令结合使用,如下面的命令会在当前目录及子目录下查看所有的jar包并生成一个整合的analyze.jar包,接下来就和上面介绍的正常的FindBugs执行方式一样了。
find ./ -name "*.jar" | xargs rejarForAnalysis
下面是一个使用rejarForAnalysis的示例
# 这一步会生成整合的analyze.jar
find ./demo -name '*.jar' | xargs rejarForAnalysis
# findbugs命令扫描整合的jar包即可
findbugs -textui -maxHeap 2048 -include filterFile.xml -html:fancy.xsl -output ./report/findbugs_demo.html analyze.jar
参考文献
[1]. http://findbugs.sourceforge.net/