Java

【Javaエンジニア必見】静的解析ツール Inferについて解説!!

1. Inferとは何か

InferはFacebookが開発し、オープンソースで提供している静的解析ツールです。Javaを含むC、C++、Objective-Cのコードを解析し、一般的なバグパターンを検出することができます。主な検出項目としては、null参照のデリファレンス、リソースリーク、メモリリーク、不適切なAPI使用、並行性問題などがあります。

2. Inferの特徴

Inferの一番の特徴は、その「追跡型」の解析能力です。一部のバグはコードの一部だけを見ても発見することが難しく、一連の処理フローを追跡することで初めて検出できるものです。Inferはこのような問題も解析し、コード内でのデータフローを詳しく追跡して、潜在的な問題を見つけ出します。

また、Inferは大規模なプロジェクトに対してもスケーラブルに動作し、インクリメンタル解析を行う能力も持っています。これにより、巨大なコードベースでも効率的にバグを検出できます。

3. Inferの使い方

Inferの使用方法は比較的簡単です。まず、GitHubからInferをダウンロードし、インストールします。そして、ソースコードのビルドプロセスの前にinferコマンドを呼び出します。例えば、Mavenを使ってJavaのプロジェクトをビルドする場合、以下のようにします。

infer run -- mvn compile

Inferはビルドプロセスをフックし、それをベースに静的解析を行います。解析結果はコンソールに出力され、infer-outディレクトリにJSON形式で保存されます。

4. Inferの結果

Inferが検出したバグはリストとして表示され、各バグに対して詳細な説明と潜在的な解決策が示されます。しかし、必ずしもすべてが真のバグではなく、一部は誤検出(false positive)の可能性もあります。したがって、結果の解釈と適切な対応は開発者の判断に委ねられます。

5. Inferとその他の品質保証活動

静的解析ツールはコードの品質を確保するための一つの手段ですが、それだけで完全な品質保証ができるわけではありません。Inferを導入したからと言って、他の品質保証活動(例えば、コードレビュー、テスト、動的解析など)を無視するべきではありません。それらと組み合わせることで、より堅牢なソフトウェアを開発することが可能になります。

静的解析ツールは、コードの品質を一定の水準に保つための有効なツールであり、Inferはその中でも高いパフォーマンスを発揮します。既存の品質保証活動と組み合わせることで、より信頼性の高いソフトウェア開発が可能になるでしょう。

実際にやってみる

Inferを使用してJavaのプロジェクトを静的解析する基本的な手順は以下の通りです:

まず、Inferをインストールします。公式のGetting Startedガイドに従ってください。

Inferがインストールされていることを確認したら、Javaプロジェクトのルートディレクトリに移動します。そして、以下のコマンドを実行します。

infer run -- mvn clean compile

これにより、InferがMavenビルドプロセスをフックし、その過程で静的解析を行います。

解析が完了すると、Inferは検出したバグのリストをコンソールに出力します。各バグには一意のIDが付けられ、その詳細を調べることができます。

例えば、以下のような出力があったとします:

Found 1 issue

src/main/java/com/example/inferdemo/DemoApplication.java:10: error: NULL_DEREFERENCE
  object `null` last assigned on line 9 could be null and is dereferenced at line 10.
  8.       String s = null;
  9.       if (Math.random() > 0.5) s = "Hello, Infer!";
  10. >    System.out.println(s.length());
  11.    }
  12. }

この例では、DemoApplication.javaファイルの10行目でNULL_DEREFERENCEというバグが検出されています。具体的には、sという変数がnullの可能性があり、それをデリファレンス(ここでは.length()メソッドを呼び出している)しているため、nullポインタ例外が発生する可能性があるとInferは警告しています。

このように、Inferは静的解析を通じてバグを予測し、それを早期に検出することを助けます。ただし、Inferの結果は必ずしも真のバグを示すわけではなく、一部は誤検出(false positive)の可能性もあるため、適切な判断と対応が必要です。

ABOUT ME
hibiki
高卒→公務員→大手WEB IT企業でソフトウェアエンジニアをしています。 未経験から大手WEB IT企業で働くまでにやったことなどを配信していきます! またアメリカのオンライン大学でコンピュータサイエンスを取得中(2年生)です。