vlambda博客
学习文章列表

FindBugs源码分析工具使用指南



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进行查看

FindBugs源码分析工具使用指南

以生成的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/