静态分析工具—FindBugs

 

静态分析工具—FindBugs

 

什么是FindBugs

FindBugs 是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。不是通过分析类文件的形式或结构来确定程序的意图,而是通常使用 Visitor 模式。

静态分析工具承诺无需开发人员费劲就能找出代码中已有的缺陷。当然,如果有多年的编写经验,就会知道这些承诺并不是一定能兑现。尽管如此,好的静态分析工具仍然是工具箱中的无价之宝。

FindBugs可以发现许多代码中间潜在的bug。比如引用了空指针(null pointer dereference), 特定的资源未关闭,等等。如果用人工检查的方式,这些bug可能很难才会被发现,或许永远也无法发现,直到运行时发作。

FindBugs的使用时机

开发阶段

当完成了某一部分功能模块开发的时候(这通常是指代码撰写完成,并已debug通过之后),可藉由FindBugs对该模块涉及的java文件进行一次扫描,以发现一些不易察觉的bug或是性能问题。交付新版的时候,开发团队可以跑一下FindBugs,除掉一些隐藏的Bug。

在开发阶段使用FindBugs,一方面开发人员可以对新版的品质更有信心,另一方面,测试人员藉此可以把更多的精力放在业务逻辑的确认上面,而不是花大量精力去进一些要在特殊状况下才可能出现的BUG(典型的如Null Pointer Dereference)。从而可以提高测试的效率。

维护阶段

这里指的是系统已经上线,却发现因为代码中的某一个bug导致系统崩溃。在除掉这个已暴露的bug之后,为了快速的找出类似的但还未暴露的 bug,可以使用FindBugs对该版的代码进行扫描。当然,在维护阶段使用FindBugs往往是无奈之举,且时间紧迫。此外,如果本来在新版交付的时候就使用过FindBugs的话,往往意味着这种bug是FindBugs还无法检测出的。这也是FindBugs局限的地方。

FindBugs使用入门

下载安装

从sourceforge网站可以下载到最新的版本,下载地址:

http://sourceforge.net/projects/findbugs/files/findbugs%20eclipse%20plugin/

下载之后,把解压后的文件拷贝到

IntelliWeb Studio 2.0/thirdparty-plugins/eclipse/plugins目录下,重新启动eclipse即完成安装。

eclipse配置

              装好Findbugs以后,选择Windows -> Show View -> Other

 

           选择FindBugs -> Bug Explorer

然后在Package Explorer或Navigator视图中,选中你的Java项目,点击右键,可以看到“Find Bugs”菜单项,子菜单项里有“Find Bugs”和“Clear Bug Markers”两项内容。如图:

 

我们点中“Find Bugs”,运行结束后可以在Bugs Explorer中显示:

 

选择其中一条记录,在Properties中会显示相应的说明,如图

 

 

双击,可直接查看原代码

 

 

 使用过滤器

使用过滤器我们就可以定义使用哪些bug检测器和针对哪些类进行检查,因为一旦项目比较庞大,那查看冗长的bug报告也是十分痛苦的事情。使用过滤器,过滤器用来包含或排除特殊的bug报告。这样做有助于在特定的时间段内,聚焦我们的关注点。过滤器实际是在一个xml文件定义的,xml配置文件的内容如下:

<FindBugsFilter>

     <!--  所有类使用bugcode为HE的检测器  -->

     <Match>

         <BugCode  name ="HE"/>

     </Match>

     <!--  该类使用所有的bug检测器  -->

     <Match class ="com.foobar.AClass"/>    

     <!--  该类使用bugcode为HE的检测器  -->

     <Match class ="com.foobar.BClass">

         <BugCode  name ="HE"/>

     </Match>

     <!--  该类的AMethod和BMethod方法使用bugcode为HE的检测器  -->

     <Match class ="com.foobar.CClass">

         <Or>

             <Method name ="AMethod"/>

             <Method name ="BMethod"/>

         </Or>

         <BugCode name ="HE"/>

     </Match>

</FindBugsFilter>

 

Findbugs过滤器的一些元素讲解:

<FindBugsFilter>

     <!--  该类使用所有的bug检测器  -->

     <Match>

       <Class name="com.foobar.MyClass" />

     </Match>  

     <!--  该类使用bugcode为HE的检测器  -->

     <Match class ="com.foobar.BClass">

         <BugCode  name ="HE"/>

     </Match>

     <!--  该类通过指定缩写名使用一些bug检测器  -->

     <Match>

       <Class name="com.foobar.MyClass"/ >

       <Bug code="DE,UrF,SIC" />

     </Match>

     <!--  所有类使用bugcode为HE的检测器  -->

     <Match>

         <BugCode  name ="HE"/>

     </Match>

     <!--  所有类使用bugcode为DE,UrF,SIC的检测器  -->

     <Match>

       <Bug code="DE,UrF,SIC" />

     </Match>

     <!--  所有类通过指定检测器种类使用某些检测器  -->

     <Match>

       <Bug category="PERFORMANCE" />

     </Match>

     <!--  该类的指定方法使用bugcode为DC的检测器  -->

     <Match>

       <Class name="com.foobar.MyClass" />

       <Or>

       <Method name="frob" params="int,java.lang.String" returns="void" />

       <Method name="blat" params="" returns="boolean" />

       </Or>

       <Bug code="DC" />

     </Match>

     <!--  该类的AMethod和BMethod方法使用bugcode为DE,UrF,SIC的检测器  -->

     <Match>

        <Class name="com.foobar.MyClass" />

         <Or>

             <Method name ="AMethod"/>

             <Method name ="BMethod"/>

         </Or>

         <BugCode name ="DE,UrF,SIC "/>

     </Match>

     <!—该类的指定方法使用bug模式为OS_OPEN_STREAM的检测器 -->

     <Match>

       <Class name="com.foobar.MyClass" />

       <Method name="writeDataToFile" />

       <Bug pattern="OS_OPEN_STREAM" />

     </Match>

    <!—该类的某个方法使用优先级为2的bug模式DLS_DEAD_LOCAL_STORE 的检测器-->

    <Match>

      <Class name="com.foobar.MyClass" />

      <Method name="someMethod" />

      <Bug pattern="DLS_DEAD_LOCAL_STORE" />

      <Priority value="2" />

    </Match>

    <!—代码的指定部分使用指定bugcode或bug模式的检测器 -->

    <!—所有包的信息类使用bugcode为UUF的检测器-->

    <Match>

      <Class name="~.*\.Messages" />

      <Bug code="UUF" />

    </Match>

    <!—所有内部包使用bugcode为MS的检测器-->

    <Match>

      <Package name="~.*\.internal" />

      <Bug code="MS" />

    </Match>

    <!—ui包层使用bug模式为SIC_INNER_SHOULD_BE_STATIC_ANON的检测器-->

    <Match>

      <Package name="~com\.foobar\.fooproject\.ui.*" />

      <Bug pattern="SIC_INNER_SHOULD_BE_STATIC_ANON" />

    </Match>

    <!—带指定标志的成员域或方法使用指定bugcode或bug模式的检测器-->

       <!—所有类中的void main(String[])方法使用bug模式为DM_EXIT的检测器-->

       <Match>

         <Method returns="void" name="main" params="java.lang.String[]" />

         <Bug pattern="DM_EXIT" />

       </Match>

       <!—所有类中的com.foobar.DebugInfo型的域使用bugcode为UuF的检测器-->

       <Match>

         <Field type="com.foobar.DebugInfo" />

         <Bug code="UuF" />

       </Match>

</FindBugsFilter>

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sencerity

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值