Edited at

infer を導入して Android プロジェクトをコード解析してみた

More than 3 years have passed since last update.

Facebook が 静的コード解析ツール infer を公開しました。

公式ページ を参考に導入して、試しに Android プロジェクトを解析してみました。


導入

github の リリースページ から、使用している OS 別にファイルをダウンロードします。

ここでは Mac OS X 用の infer-osx-v0.1.0.tar.xz を使います。この記事の公開時点での最新バージョンは version 0.1.0 です。

ダウンロードした infer-osx-v0.1.0.tar.xz を展開します。

展開すると infer-osx-v0.1.0/ ディレクトリが出来ます。

$ ~ ls

$ ~ infer-osx-v0.1.0.tar.xz
$ ~
$ ~ tar xf infer-osx-v0.1.0.tar.xz
$ ~
$ ~ ls
$ ~ infer-osx-v0.1.0.tar.xz infer-osx-v0.1.0

infer-osx-v0.1.0/infer/infer/bin にパスを通します。各自の環境に合わせてください。

export INFER=~/infer-osx-v0.1.0/infer/infer/bin

export PATH=$INFER:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH

これで導入は完了です。


コード解析

Hello world Android を参考に、新規作成した Android プロジェクトをコード解析してみます。

$ ~ cd SampleInfer/

$ SampleInfer
$ SampleInfer infer -- ./gradlew clean build
Starting analysis (Infer version v0.1.0)
Analysis done

5 files analyzed

No issues found
$ SampleInfer

コード解析に成功し、問題ないことを確認できました。


問題点

現在、Butterknife などアノテーションを付与してクラスを生成するようなライブラリを使用しているプロジェクトに対してコード解析を行うと怒られます。

試しに、新規作成した Android プロジェクトに Butterknife を用いてイカのようなコードにします。


MainActivity.java

package com.sample.infer.sampleinfer;

import butterknife.InjectView;

public class MainActivity extends AppCompatActivity {

@InjectView(R.id.textview)
protected TextView textView;


この状態でコード解析すると

$ ~ cd SampleInfer/

$ SampleInfer infer -- ./gradlew clean build
Fatal error: exception Invalid_argument("Error : com.sample.infer.sampleinfer.MainActivity$$ViewInjector is not a valid name for a class")
$ SampleInfer

と、生成された MainActivity$$ViewInjector クラスの名前に引っかかるようです。

github には issue が立っているので対応を待ちましょう。

Support java classnames with $$ #3

以上です。