Android Studio工具篇FindBugs

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,671评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,183评论 25 707
  • 2013年去九华山,没地方停车,把车子停到了镇上的超市门口了,老板出来收停车费,要50块钱。 我说:“这样吧,给你...
    牛哥语录阅读 413评论 0 3
  • 是什么让你有勇气继续喜欢着一个不喜欢你的人 很早说了晚安却在很晚的时间看见了他的动态,他并没有困没有睡,只是找个借...
    温小柔阅读 538评论 0 1
  • 1.GCD特点:易用,易读,直观,灵活,高性能gcd其实没有线程的概念,其实gcd的多线程是由于多任务概念带来的效...
    seventhboy阅读 108评论 0 0