ランダム Cプログラムジェネレータ Csmith

はじめに

ランダム Cプログラムジェネレータ Csmithの紹介.

http://embed.cs.utah.edu/csmith/


コンパイラのテストでランダムテストは効果的であるというのが
昔から言われていまして、いくつかその手のものがあるのですが、
Csmithは GCCllvm-clangで多くのバグを見つけたというのが
紹介されていたので気になってました。


論文は結構前から読めたのですが、ソースが公開されたのは
最近なのでインストールして使ってみました。そのときのメモ。

ビルド

あんまり詳細なことが書かれていないのでよくわかってないですが、
C++コンパイラがあればビルドできると思います。
Ubuntu 10.10(x64) g++ 4.4.5で確認しました.

  % wget http://embed.cs.utah.edu/csmith/csmith-2.0.0.tar.gz
  % tar tf csmith-2.0.0.tar.gz
  % cd csmith-2.0.0
  % ./configure --prefix=/home/syohei/local/csmith
  % make
  % make install

付属のツールを使ってコンパイラのテストを行う場合は make installは不要です。
csmithコマンドを単独で使いたい場合は make installしてください。

使ってみる

csmithと叩けば、Cプログラムが自動生成されます。

  % csmith  # 標準出力に自動生成されたプログラムが出力される

ファイルに出力する場合はリダイレクトを使ってください。
デフォルトだと 1000から 2000行程度のプログラムが生成されます。

デフォルトの設定確認, 設定の変更
  % csmith --dump-default-probabilities default.conf
  # default.confにデフォルトの設定情報が書きこまれます。
  % csmith --probability-configuration my.conf
  # my.confを設定ファイルとして指定

いろいろあるみたいですが、分岐についてだったり、代入文の割合だったりを
変更する、などなどのことができるようです。

テストする

Csmithのソースツリーの scripts以下にテストのためのツールが含まれています。

  % export CSMITH_PATH="Csmithのソースがあるディレクトリ"
  % cd $CSMITH_PATH/scripts
  % cp compiler_test.in my_compiler_test.in
  % # コンパイラとオプションを指定する my_compiler_test.inを編集する
  % ./comiler_test.pl (テスト回数) my_compiler_test.in

設定ファイルですが、デフォルトのものは以下のようになっていました。

gcc-4.0 -O0
gcc-4.0 -O1
gcc-4.0 -O2
gcc-4.0 -O3
gcc-4.0 -Os

一番目のフィールドがコンパイラでそれ以降がオプションと思われます。


基本的には延々と回し続けて、問題が見つかったらそれを調査という形に
なるのでしょうかね。


詳細はこちら.


バグレポートを書く前にするべきことも書いているので、いろいろ参考になることでしょう。
コンパイラのバグを見つけるのは easyだけど、レポートを書くのは hardと記されてますね。

まとめ

ランダム Cプログラムジェネレータ Csmithについて紹介しました。


この手のもので思うのはどうやってテストを最小化するかということなの
ですが、その手段については特に書いていませんでした。
今のところは自力でやれということなんですかね。