Documents of TEBA

TEBA を用いた解析の実現例

1 CFG の解析例

1.1 PDG(Program Dependency Graph)の生成

ソースファイル: print_pdg.pl

文を単位としたプログラム依存グラフ(PDG)を生成する。ただし、ポインタや配列は 扱っていない。PDG は、GraphViz の DOT 形式で出力する。

生成にあたっては、CFG の経路ごとに、変数がどの文での計算結果を使用しているかを計算していく。 このとき、CFG 上の経路数を有限に抑えつつ、必要な依存関係が求まるよう、 繰り返しは最大で2回までに制限している。

PDG を pdf 形式で取得するには、cparse.pl -j hoge.c | ./print_pdg.pl | dot -Tpdf -o hoge.pdf と、AST(JSON) を入力し、出力を dot コマンドで変換すればよい。

1.2 実行パスの表示

ソースファイル: print_path.pl

各実行経路ごとに、評価した式を表示する。条件分岐の場合は、真偽のどちらに進んだかも表示する。

実行経路は、繰り返しが存在すると、その数は無限になる。そこで、最大で2回まで繰り返すように限定する。 多くの静的解析では、2回までの繰り返しにより、必要な依存関係の情報を得られることが多い。

実行するには、cparse.pl -j hoge.c | ./print_path.pl と、ソースコードを AST(JSON) に変換して入力させればよい。

2 構文木(AST)の解析例

2.1 制御文の抽出

ソースファイル: print_ctrl_stmt.pl

JSON 形式の構文木を深さ優先で辿り、制御文の情報を出力する方法を示すデモツールである。

2.2 関数呼出しの抽出

ソースファイル: print_func_call.pl

JSON 形式の構文木を深さ優先で辿り、関数呼び出しの情報を出力する方法を示すデモツールである。

2.3 関数呼出しの抽出と行番号

ソースファイル: print_func_call_with_linenum.pl

JSON 形式の構文木を深さ優先で辿り、関数呼び出しの情報を出力する方法を示すデモツールである。 1つ前のツールを拡張したもので、深さ優先で辿りつつ、テキストにおける行数を数え、 関数呼び出しの出現開始行も出力する。

2.4 変数名に対応関係の推定

ソースファイル: var_unify.tar.gz

2つのプログラムの変数名の対応関係を調べるツールのデモ版である。 IdUnify.pm を使って、2つの構文木の内部識別記号を揃えることで、 構文木の要素を対応づけたている。そのあと、対応する変数の組のリストを作り、 出現数が多い組から確定していく。

このアーカイブファイルを展開すると、2つのプログラム test1.c, test2.c が入っている。 変数名は対応関係がわかりやすいように、一方は同じ変数名の後ろに _ をつけている。 デモの実行方法は Makefile に定義してあるので、make を実行して確認すること。

3 解析支援

3.1 複数のファイルをまとめて解析

ソースファイル: c2json.pl

カレントディレクトリ(または指定したディレクトリ)の下にあるすべての ’*.c’ ファイルを検索し、それらを JSON 形式の構文木に変換して、ファイルに保存する。 生成されるファイルは、カレントディレクトリ(または指定したディレクトリ)の直下の JSON というディレクトリの下に、元のディレクトリ構造を保って格納される。 また、変換は、論理CPUの数に合わせて、並列に実行される。

なお、これを使用するには Perl の以下のモジュールが必要である。 - File::Find::rule (ファイルを検索するためのモジュール) - MCE (Many Core Engine; 並列に処理するためのモジュール)

Copyrighted by Atsushi Yoshida. atsu@nanzan-u.ac.jp
Contact: Yoshida Atsushi, atsu@nanzan-u.ac.jp
[Documents of TEBA]