def yasuharu519(self):

日々の妄想

FacebookがOSS化した静的プログラム解析ツールinferを試してみた

はじめに

Facebookがまた新しいツールオープンソースにしたらしい。

inferは、Android, iOSなどに使用できる、スタティックなプログラムアナライザで、プログラムの静的解析が可能なものらしい。 NULLポインタアクセスや、メモリリークなどを検知できるらしい。

もともとは、イギリスのMonoidicsという会社が作っていた検証ツールで、2013年にFacebookが買収していたみたい。 Monodicsが作っていた「INFER」は、三菱電機やアメリカのARM, Airbusなどで使われていたみたい。以下のページが詳しい。

インストール

このページにインストール方法が書かれている。ソースからビルドすることも可能だけど、元々のコードがOcamlで書かれててそのビルド環境を用意する必要もあるし、MacOSXLinux用にはプレビルド版も用意されてるので、そちらを素直に使うのが良さそう。

Macの場合は、

よりダウンロードして、

tar xf infer-osx-v0.1.0.tar.xz

で解凍する。 今回は $HOME/src 以下に解凍したので、

export PATH=$PATH:$HOME/local/src/infer-osx-v0.1.0/infer/infer/bin

のようにして、一時的にPATHを設定し、実行できるようにする。

分析

分析自体は、Java, Objective-C, C, Android, iOSや、Makeを使ったCのプロジェクトなどで使える。 inferのプロジェクトにexampleも用意されてるので、そこから試すことができる。

例えばCの例だと、

#include <stdlib.h>

void test() {
  int *s = NULL;
  *s = 42;
}

みたいなコードだと、int型のポインタである変数sに、NULLが最初設定されており、その後で42を代入しようとしているが、このコードを

infer -- clang -c hello.c

として、分析してみると

Starting analysis (Infer version v0.1.0)
Analysis done

1 file analyzed


hello.c:5: error: NULL_DEREFERENCE
   pointer s last assigned on line 4 could be null and is dereferenced at line 5, column 3

と表示され、4行目でsがNULLになっている可能性があり、5行目でそのNULLに代入しようとしているということがわかる。このコードを例えば

#include <stdlib.h>

void test() {
  int *s = NULL;

  if (s != NULL)
  {
    *s = 42;
  }
}

のように変更すると、

Starting analysis (Infer version v0.1.0)
Analysis done

1 file analyzed


No issues found

となり、エラーが消えたことがわかる。 iOSのビルドでも分析ができるようで、プロジェクトのルートディレクトリまで移動して

infer -- xcodebuild -target {ターゲット名} -configuration Debug -sdk iphonesimulator

のように実行するとビルドが走って、分析されるよう。

まとめ

今回は、FacebookからinferがOSSされたというニュースを聞き、一旦試してみた。 導入のための情報もまとまっていて、導入から実行まで非常に簡単にできる。 こういったツールが大きい企業に買収された後、どんな人でも使えるような形で公開されるのは非常にありがたいし、 人類の進歩を感じる。これが一種のノブレスオブリージュなのかもしれない。

会社ではC++を使ったプロジェクトに関わっているが、現状C++には対応してないみたい(試してないけど)。 小さい目のプログラムではきちんと動作してるみたいなので、 大きいプロジェクトとかになった時にも有用か調べてみたい(動作時間など)

iOSプロジェクトとかAndroidプロジェクトで使用されて、バグフリーなプログラムが増えればいいなあという妄想。