Kengo's blog

Technical articles about original projects, JVM, Static Analysis and TypeScript.

FindBugsコードリーディング

FindBugsをMavenizeしたツワモノがいるのでありがたくeclipse:eclipseしてコードを読んだ。srcとsrc/javaの両方がsource folderとして認識されているのでそこだけ手直ししてやる必要があったが、概ね良好。

"findbugs.execplan.debug"みたいな環境変数を指定してやるとデバッグモードになる、というのは前から知ってたけど細かい処理の流れや登場人物について調べるのはコレが初めて。複雑だろうとは思ってたけど予想以上に汚かった。

起動してからの流れ

  1. edu.umd.cs.findbugs.LaunchAppropriateUI がmain
  2. Headless環境ならedu.umd.cs.findbugs.FindBugs2.main()を蹴る
  3. 解析処理
    • FindBugs2クラスのインスタンス生成
    • FindBugs.processCommandLine()で引数をparse
    • FindBugs.runMain()で解析を開始
    • FindBugs2#execute()を呼び出して解析実行、レポートも生成する(複雑)
  4. 解析結果を標準エラー出力に出す(FindBugs.runMain())
    • bugCount, missingClassCount, errorCountをFindBugs2のインスタンスから取り出す
  5. システムの終了
    • 必要に応じてバグの有無、エラーの有無などからexitCodeを算出
    • System.exit(int)の呼び出し
      • なんとここで呼び出すとは

鍵っぽいインタフェース郡

Project

クラスパスとか解析に関連する情報が入ってる。FindBugs2#buildClassPath()を見る限り、getFileArray()が解析対象、getAuxClasspathEntryList()が依存先を意味すると思われる。

ExecutionPlan

実行するDetectorないしその実行順を決める。AnalysisPassもあわせて読むこと。

そのうち更新します。