FindBugs是什么
FindBugs 是一个查找代码潜在错误的工具.
FindBugs-IDEA 工具使用
扫描区域
- Analyze Current file: 仅扫描当前文件
- Analyze Class (non-anonymous): 扫描所有类(非匿名内部类)
- Under Cursor: 扫描光标下所有的源文件
- Analyze Package(s) files: 扫描整个包名下的所有文件
- Analyze Module files:扫描整个模块
- Analyze Package files 扫描
- Analyze Scope files
BUG分类策略
- 按BUG策略分组
- 按BUG出现在哪里类进行分组
- 按BUG出现在哪个Package上进行分组
- 按BUG的严重等级进行分组
过滤FindBugs中的检测内容
FindBugs就像是一个有严重的洁癖患者,它会检测你代码上所有不规范的内容.如果你让它按照默认的规则检测你的项目,那么检测结果会让你严重怀疑人生.
设置一些检测过滤条件你好我也好.
FindBugs过滤器语法
FindBugs的过滤器是以XML的形式存在:
- FindBugsFilter:根节点名称.它可能包含多个Match节点作为子元素,根据Match节点的正则表达式内容,Match节点可以是包含错误实例,也可能是筛选错误实例,
Match节点的属性参数支持
- <Bug> 该元素可以匹配特定的Bug模式,细粒度匹配可以使用code属性.对于大都是粗粒度匹配,使用category.
category属性存在以下枚举类型:
CORRECTNESS(正确性), MT_CORRECTNESS, BAD_PRACTICICE(不好的做法), PERFORMANCE(性能问题), STYLE(书写风格).
code 代号:
您可以在这里http://findbugs.sourceforge.net/bugDescriptions.html找到相关的code 代号
<Match>
<Class name="com.foobar.A" />
<!--IC: Superclass uses subclass during initialization
(超类在初始化过程中使用子类,其中IC是BUG代号)-->
<Bug code="IC" />
</Match>
<Match>
<Bug category="PERFORMANCE" />
</Match>
- <Confidence>(配置Match的可信度警告)
该属性用于配置Match的可信度
value值必须是整型 高可信度(1),正常可信度(2),低可信度(3),另在2.0版本中,已完全替代Priority属性的功能.
<!-- A method with a dead local store false positive (medium priority). -->
<Match>
<Class name="com.foobar.MyClass" />
<Method name="someMethod" />
<Bug pattern="DLS_DEAD_LOCAL_STORE" />
<Priority value="2" />
</Match>
- <Rank>
我们在检测潜在BUG时,可能有些BUG是我们非常关心的,有些可能是不痛不痒的小问题,Rank给我们提供了为这些告警提供分类的支持.
Rank 的value取值区间在[1,20],其中[1,4]最严重 [5,9],[10,14] [15,20]依次递减.
使用方法跟<Confidence> 一样,这里就不举例了.
- <Package>
检测name指定的包名下的类文件,但是不包括使用了import name(包名)的类.当然使用正则表达式可以轻松实现匹配多个包.
<!--Match bugs in specific parts of the code base-->
<!-- match unused fields warnings in Messages classes in all packages -->
<Match>
<Class name="~.*\.Messages" />
<Bug code="UUF" />
</Match>
<!-- match mutable statics warnings in all internal packages -->
<Match>
<Package name="~.*\.internal" />
<Bug code="MS" />
</Match>
<!-- match anonymoous inner classes warnings in ui package hierarchy -->
<Match>
<Package name="~com\.foobar\.fooproject\.ui.*" />
<Bug pattern="SIC_INNER_SHOULD_BE_STATIC_ANON" />
</Match>
- <Class>
此元素匹配与特定类相关的警告,name属性用于指定类名称的精确匹配模式或正则表达式匹配模式.
如果Match元素既不包含Class元素也不包含class / classregex属性,则该检测策略将应用于所有类.这样的检测策略很可能会匹配更多的错误实例,除非用适当的方法或字段进一步细化。
- <Source>
此元素匹配与特定源文件关联的警告。 name属性用于指定源文件名的精确或正则表达式匹配模式。
<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
<Match>
<!--Full exclusion filter file to match all classes generated from Groovy source files.-->
<Source name="~.*\.groovy" />
</Match>
</FindBugsFilter>
- <Method>
这个元素指定一个方法,该name用于指定精确指定或者正则表达式匹配方法名称.params属性是方法参数类型(多个参数以逗号分隔),returns属性是方法的返回类型.role属性是方法角色.在params和returns,类名必须完全限定名。 (例如,“java.lang.String”而不是“String”。)如果指定了其中一个属性,
您可以只提供name属性||name及params属性 或者name/params/returns属性全部三者全部提供,这样你可以精确匹配方法签名。
<!-- match System.exit(...) usage warnings in void main(String[]) methods in all classes -->
<Match>
<Method returns="void" name="main" params="java.lang.String[]" />
<Bug pattern="DM_EXIT" />
</Match>
<!-- match UuF warnings on fields of type com.foobar.DebugInfo on all classes -->
<Match>
<Field type="com.foobar.DebugInfo" />
<Bug code="UuF" />
</Match>
- <Field>
指定一个字段,name属性用于精确指定或者正则表达式匹配字段名称, 您还可以根据其签名使用type属性来过滤字段以指定字段的完全限定类型,当然您也可以指定其中一个或两个属性,以便执行基于名称/签名的匹配。
<!-- match UuF warnings on fields of type com.foobar.DebugInfo on all classes -->
<Match>
<Field type="com.foobar.DebugInfo" />
<Bug code="UuF" />
</Match>
<Local>
局部变量是方法中定义的变量,这个元素指定一个局部变量。name属性用于精确指定或者正则表达式匹配局部变量。<Or>
该元素将Match子句作为分离符组合,也就是说,您可以将两个Method元素放在Or子句中以匹配任一方法。
<!-- Match all doublecheck violations in these methods of "AnotherClass". -->
<Match>
<Class name="com.foobar.AnotherClass" />
<Or>
<Method name="nonOverloadedMethod" />
<Method name="frob" params="int,java.lang.String" returns="void" />
<Method name="blat" params="" returns="boolean" />
</Or>
<Bug code="DC" />
</Match>
<And>
这个元素结合了Match子句,只有当两个Match语句同时满足时才集合才有效.<Not>
这个元素颠倒了包含的Match子对象。 也就是说你可以在一个Not子句中加入一个Bug元素来匹配除了给定的bug之外的任何bug。
<!-- All bugs in test classes, except for JUnit-specific bugs(排除Junit错误) -->
<Match>
<Class name="~.*\.*Test" />
<Not>
<Bug code="IJU" />
</Not>
</Match>
注意:如果Class,Source,Method或Field的name属性以〜字符开头,则表示该name属性采用正则表达式匹配.
参考链接:FindBugs™ Manual http://findbugs.sourceforge.net/manual/index.html