Findbugs的安装及使用


源码检测包括代码检查、静态结构分析、代码质量度量等。它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行。

介绍

源码检测

(一些源码检测工具)

源码检测包括代码检查、静态结构分析、代码质量度量等。它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行。代码检查代码检查包括代码走查、桌面检查、代码审查等,主要检查代码和设计的一致性,代码对标准的遵循、可读性,代码的逻辑表达的正确性,代码结构的合理性等方面;可以发现违背程序编写标准的问题,程序中不安全、不明确和模糊的部分,找出程序中不可移植部分、违背程序编程风格的问题,包括变量检查、命名和类型审查、程序逻辑审查、程序语法检查和程序结构检查等内容。

Findbugs介绍

Findbugs是一个静态分析工具,它检查类或者JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。Findbugs自带检测器,其中有60余种Bad practice,80余种Correctness,1种 Internationalization,12种Malicious code vulnerability,27种Multithreaded correctness,23种Performance,43种Dodgy。我们还可以自己配置检查规则(做哪些检查,不做哪些检查),也可以自己来实现独有的校验规则(用户自定义特定的bug模式需要继承它的接口,编写自己的校验类,属于高级技巧)。

安装及运行(非插件版)(后文都是基于非插件版)

依赖

必须:

  1. Jdk7u(新版ant编译时会报错)

    1. 解压至/usr/local
    2. 配置环境变量vim /etc/bash.bashrc

      1
      2
      3
      4
      export JAVA_HOME=/usr/local/jdk1.7.0_80
      export JRE_HOME=/usr/local/jdk1.7.0_80/jre
      export PATH=$PATH:/usr/local/jdk1.7.0_80/bin
      export CLASSPATH=./:/usr/local/jdk1.7.0_80/lib:/usr/local/jdk1.7.0_80/jre/lib
    3. source并查看version

  2. Ant-1.9.x(https://ant.apache.org/bindownload.cgi)

    1. 解压至/usr/local
    2. 配置环境变量vim /etc/bash.bashrc

      1
      2
      3
      #set Ant enviroment
      export ANT_HOME=/usr/apache-ant-1.9.2
      export PATH=$PATH:$ANT_HOME/bin
    3. source并查看version

Git

非必须:

安装findbugs

  1. 下载源码:https://sourceforge.net/projects/findbugs/files/findbugs/3.0.1/findbugs-3.0.1-source.zip/download?use_mirror=jaist&download=
  2. 进入目录后运行ant build
  3. 配置环境变量vim /etc/bash.bashrc

    1
    2
    3
    #set findbugshome
    export FINDBUGS_HOME=/usr/local/findbugs-3.0.1
    export PATH=$PATH:$FINDBUGS_HOME/bin
  4. source激活

运行findbugs

输入命令findbugs直接进入gui,或者带命令行

基本原理

它主要用到的技术是缺陷模式匹配和数据流分析:

缺陷模式匹配

事先从代码分析经验中收集足够多的共性缺陷模式,将待分析代码与已有的共性缺陷模式进行模式匹配,从而完成软件的安全分析。这种方式的优点是简单方便,但是要求内置足够多缺陷模式,且容易产生误报。

数据流分析

数据流分析也是一种软件验证技术,这种技术通过收集代码中引用到的变量信息,从而分析变量在程序中的赋值、引用以及传递等情况。对数据流进行 分析可以确定变量的定义以及在代码中被引用的情况,同时还能够检查代码数据流异常,如引用在前赋值在后、只赋值无引用等。数据流分析主要适合检验程序中的 数据域特性。

检测对象

FindBugs检查.class文件,基于Bug Patterns概念,查找javabytecode(.class文件)中的潜在bug。主要检查bytecode中的bug patterns,如NullPoint空指针检查、没有合理关闭资源、字符串相同判断错(==,而不是equals)等。

检测能力

Findbugs自带检测器,其中有60余种Bad practice,80余种Correctness,1种 Internationalization,12种Malicious code vulnerability,27种Multithreaded correctness,23种Performance,43种Dodgy。

1) Bad practice 不佳实践:常见代码错误,用于静态代码检查时进行缺陷模式匹配(如重写equals但没重写 hashCode,或相反情况等)
2) Correctness 可能导致错误的代码(如空指针引用、无限循环等)
3) Internationalization 国际化相关问题(如错误的字符串转换等)
4) Malicious code vulnerability 可能受到的恶意攻击(如访问权限修饰符的定义等)
5) Multithreaded correctness 多线程的正确性(如多线程编程时常见的同步,线程调度问题等)
6) Performance 运行时性能问题(如由变量定义,方法调用导致的代码低效问题等)
7) Security 安全问题(如HTTP,SQL,DB等)
8) Dodgy code 导致自身错误的代码(如未确认的强制转换、冗余的空值检查等)

使用方法

FindBugs有两种使用形式,一是作为插件,放在Eclipse中使用,二是提供软件运行。而作为插件的形式比较方便简单,个人觉得使用起来比较合适。

深入理解findbugs

  1. Findbugs不是通过分析类文件的形式或结构来确定程序的意图,而是通常使用 观察者模式,检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。PMD也是一款静态代码分析工具,它是分析Java源文件。
  2. 可以下载到源代码,对源代码进行分析。

    1)src/jui包是Findbugs开发UI界面使用到的包,src/junit是单元测试包,里面包含有对很多类的测试用例。etc文件下是包含的一些配置文件。

    2)src/tools包下面有四个子文件夹,里面包含的是一些公用的工具类,比如打印bug描述,生成xml文件等。

    3)src/antTask包下面是针对Ant的一些类。

    4)最主要的就是src/java包下面的将近50个子文件夹,如下(未截完):

    该工具自带了一些检测器,于此同时,开发者可以根据自己的需求设计编写特定于应用程序的缺陷检测器。

    5)有一个专门的文件夹edu.umd.cs.findbugs.detect,里面包含该工具提供的所有检测器,FindBugs 利用了 Byte Code Engineering Library,或称为 BCEL,以实现其检测器。所有字节码扫描检测器都基于 visitor 模式,FindBugs 实现了这个模式。它提供了这些方法的默认实现,在实现自定义检测器时要覆盖这些方法。我们将侧重于两个方法——visit(Code)和sawOpcode(int)。在 FindBugs 分析类时,它会在分析方法内容时调用visit(Code)方法。与此类似,FindBugs 在分析方法正文中的每一个操作码时调用sawOpcode(int)方法。

定制规则

很棒的参考:

如何编写自定义检测器以查找特定于应用程序的问题

静态代码扫描——FindBugs自定义规则入门

增加自定义findbugs规则集

编写完自定义的规则后配置两个xml文件然后使用ant重新打包生成即可

关于如何编写规则

  1. FindBugs利用了BCEL字节码程序设计库,这个设计库专门用于分析java字节码,简明教程,其api文档
  2. 需要熟悉fingbugs检测器提供的api

规则整理

中文1

中文2

原文

参考文献

编写自定义检测器

提高代码质量

findBugs学习小结

FindBugs,一个不错的静态分析工具

增加自定义findbugs规则集

SpotBugs

SpotBugs是Findbugs的继任者,Findbugs已经不再维护,不过SpotBugs继承了绝大部分Fingbugs的代码结构。

-------------本文结束感谢您的阅读-------------

本文标题:Findbugs的安装及使用

文章作者:ChengXiao

发布时间:2018年07月03日 - 22:07

最后更新:2018年07月09日 - 14:07

原始链接:http://chengxiao19961022.github.io/2018/07/03/Findbugs的安装及使用/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

你的鼓励是我前进的动力~