spotbugs进阶必读!熟练使用过滤器,提升代码检查效率

65 篇文章 1 订阅
13 篇文章 0 订阅

使用过spotbugs的同学一定会有下面这两个疑问!!!

我不想对所有的代码规则都进行校验该如何处理?

我不想对所有的类都进行校验该如何处理?

今天就向大家介绍spotbugs的过滤器,然后解决上面这两个问题。

spotbugs过滤器

从概念上讲,过滤器根据一组标准匹配bug实例。通过定义过滤器,您可以选择bug实例进行特殊处理;例如,在报告中排除或包括它们。 过滤器文件是一个带有顶级FindBugsFilter元素的XML文档,该元素有一定数量的Match元素作为子元素。每个Match元素代表一个应用于生成的错误实例的谓词。通常,过滤器将用于排除bug实例。例如:

spotbugs -textui -exclude myExcludeFilter.xml myApp.jar

我们也可以使用过滤器来选择要特别报告的bug实例:

spotbugs -textui -include myIncludeFilter.xml myApp.jar

过滤器字段中的含义

myExcludeFilter.xml 或者 myIncludeFilter.xml是需要遵循一定的编写规则的,在这里就来介绍一下具体的规则

给大家举两个经典的例子

实例1

<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
        <Match>
          <Class name="com.example.demo.MyClass />
          <Bug category="PERFORMANCE" />
        </Match>      
</FindBugsFilter>

上面的例子就是只对com.example.demo.MyClass 进行PERFORMANCE类型所包括的所有37种规则进行代码检查

PERFORMANCE 类型具体的规则如下:

https://spotbugs.readthedocs.io/en/latest/bugDescriptions.html#performance-performance

实例2

<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
        <Match>
        <Bug pattern="SQL_INJECTION"/>
       </Match>

        <Match>
        <Bug pattern="XSS_REQUEST_WRAPPER"/>
       </Match>
</FindBugsFilter>

上面的例子对所有工程中的类进行SQL_INJECTION和XSS_REQUEST_WRAPPER两种类型的代码检查

下面就具体的介绍一下规则xml标签的具体含义

<FindBugsFilter>

xml文件中开头结尾必须的元素标签

<Bug>

指定了一个特定的bug类型,可以与category和pattern一起使用

<Package>

此元素匹配与特定包关联的警告,使用name属性。

<Class>

此元素匹配与特定类关联的警告,使用name属性。

<Source>

此元素匹配与特定源文件关联的警告,使用name属性。

<Method>

此元素匹配与特定方法关联的警告,使用name,returns,params属性。例如:

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

<Field>

此元素指定类中的一个字段(成员变量),使用name属性。

<Local>

此元素指方法内部局部变量,使用name属性。

<Type>

<Confidence>

此元素将警告与特定的bug重要级别相匹配。value属性应该是一个整数值:1匹配高级别警告,2匹配正常级别警告,3匹配低级别警告。<Confidence>在<Priority>2.0.0版本中替换

<Priority>

参考<Confidence>

<Rank>

此元素匹配至少具有指定错误等级的警告。value属性应该是1到20之间的整数值,其中1到4是最可怕的,5到9是可怕的,10到14是麻烦的,15到20是值得关注的bug。与<Confidence>和<Priority>功能类似

<Or>

此元素将Match子句组合为OR语句。也就是说,匹配其中一个子句即可。

<And>

这个元素组合了Match子句组合为and语句,所有子句都匹配。

<Not>

此元素反转包含的子Match。也就是说,你可以在Not子句中放入一个Bug元素,以匹配除给定bug之外的任何bug。

过滤器中正则的应用

如果描述符以~字符开头,则其余属性内容将被解释为Java正则表达式。例如有三个包

com.example.demo1

com.example.demo2

com.test.demo1

想要测试com.example.demo1和com.example.demo2两个包中的类,编写如下代码即可

<Package name="~com\.example\.demo.*" />

Maven中关于filter文件的配置

<plugin>
                  <groupId>com.github.spotbugs</groupId>
                  <artifactId>spotbugs-maven-plugin</artifactId>
                 <version>4.5.3.0</version>
                   <configuration>
                    <includeFilterFile>myfilter-include.xml</includeFilterFile>
                  </configuration>
     </plugin>

我的每一篇文章都希望帮助读者解决实际工作中遇到的问题!如果文章帮到了您,劳烦点赞、收藏、转发!您的鼓励是我不断更新文章最大的动力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

测试开发Kevin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值