sashimi4’s diary

日々の雑多なメモを書きます

現存するFindBugsErrorを全て除外設定してみる

いろいろな理由から、
「今あるFindBugsのエラーを一旦無視したい!」「だけどFindBugs自体は有効化させたままでいたい…!」
という時があるかもしれません。
(私は既存プロジェクトにFindBugsを途中から導入しようとしてこうなりました…。既に数百件のエラーがあります…。)
(「とりあえず今あるエラーは一旦無視して、これから発生する分は随時対応しようね」ということにしました。)

除外ルールを自動生成してしまおう!

FindBugsのレポートを生成

パースしやすいように、一時的にXMLにします。

task findbugs(type: FindBugs) {
  ...
  ignoreFailures = false
  effort = "max"
  reportLevel = "low"
  excludeFilter = new File("${project.rootDir}/config/findbugs/findbugs_filter.xml")
  classes = files("$project.buildDir/intermediates/javac/")

  source 'src/main'
  include '**/*.java'

  reports {
//    xml.enabled = false
//    html.enabled = !xml.isEnabled()
//    html {
//      destination(new File("${project.rootDir}/build/reports/findbugs_report.html"))
//    }
    // 一時的に形式をXMLに変更
    xml.enabled = true
    html.enabled = !xml.isEnabled()
    html {
      destination(new File("${project.rootDir}/build/reports/findbugs_report.xml"))
    }
  }
  classpath = files()
  ...
}

Findbugsを実行

$ ./gradlew build # FindBugsは成果物を静的解析するので、まだであればbuildする
$ ./gradlew findbugs

除外ルール自動生成

$ cat fb-filter-generator.rb
#! /usr/bin/ruby
require 'active_support'
require 'active_support/core_ext'
require 'open-uri'

def create_match(classname:, abbrev:)
  <<~EOS
  <Match>
      <Class name="#{classname}"/>
      <Bug code="#{abbrev}"/>
  </Match>
  EOS
end
hash = Hash.from_xml open('./build/reports/findbugs_report.xml').read

filter_xml = ""
hash["BugCollection"]["BugInstance"].each do |bi|
  if bi["Class"].is_a?(Array)
    bi["Class"].each do |bc|
      filter_xml << create_match(classname: bc["classname"], abbrev: bi["abbrev"])
    end
  else
    filter_xml << create_match(classname: bi["Class"]["classname"], abbrev: bi["abbrev"])
  end
end

File.open('./findbugs_filter.xml','w') do |file|
    file.puts <<~EOS
    <?xml version="1.0" encoding="UTF-8"?>
    <FindBugsFilter>
      #{filter_xml}
    </FindBugsFilter>
  EOS
end

↑のスクリプトをプロジェクト直下で実行します。

$ ruby ./fb-filter-generator.rb

実行したディレクトリに findbugs_filter.xml という除外ルールのファイルができるはずです。

私はFindBugsの除外ファイルを

excludeFilter = new File("${project.rootDir}/config/findbugs/findbugs_filter.xml")

と設定していますので、

$ mv ./findbugs_filter.xml ./config/findbugs/findbugs_filter.xml

と実行して設置しました。

これで、いま存在するFindBugsのエラーが全て除外できます!!!