美文网首页
Android Studio工具篇FindBugs

Android Studio工具篇FindBugs

作者: 天神Deity | 来源:发表于2017-11-03 11:45 被阅读412次

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

相关文章

网友评论

      本文标题:Android Studio工具篇FindBugs

      本文链接:https://www.haomeiwen.com/subject/svvwpxtx.html