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)の可能性もあるため、適切な判断と対応が必要です。