ソースファイル: 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 コマンドで変換すればよい。
ソースファイル: print_path.pl
各実行経路ごとに、評価した式を表示する。条件分岐の場合は、真偽のどちらに進んだかも表示する。
実行経路は、繰り返しが存在すると、その数は無限になる。そこで、最大で2回まで繰り返すように限定する。 多くの静的解析では、2回までの繰り返しにより、必要な依存関係の情報を得られることが多い。
実行するには、cparse.pl -j hoge.c | ./print_path.pl
と、ソースコードを AST(JSON) に変換して入力させればよい。
ソースファイル: print_ctrl_stmt.pl
JSON 形式の構文木を深さ優先で辿り、制御文の情報を出力する方法を示すデモツールである。
ソースファイル: print_func_call.pl
JSON 形式の構文木を深さ優先で辿り、関数呼び出しの情報を出力する方法を示すデモツールである。
ソースファイル: print_func_call_with_linenum.pl
JSON 形式の構文木を深さ優先で辿り、関数呼び出しの情報を出力する方法を示すデモツールである。 1つ前のツールを拡張したもので、深さ優先で辿りつつ、テキストにおける行数を数え、 関数呼び出しの出現開始行も出力する。
ソースファイル: var_unify.tar.gz
2つのプログラムの変数名の対応関係を調べるツールのデモ版である。 IdUnify.pm を使って、2つの構文木の内部識別記号を揃えることで、 構文木の要素を対応づけたている。そのあと、対応する変数の組のリストを作り、 出現数が多い組から確定していく。
このアーカイブファイルを展開すると、2つのプログラム test1.c, test2.c
が入っている。
変数名は対応関係がわかりやすいように、一方は同じ変数名の後ろに
_
をつけている。 デモの実行方法は Makefile
に定義してあるので、make を実行して確認すること。
ソースファイル: c2json.pl
カレントディレクトリ(または指定したディレクトリ)の下にあるすべての
’*.c’ ファイルを検索し、それらを JSON
形式の構文木に変換して、ファイルに保存する。
生成されるファイルは、カレントディレクトリ(または指定したディレクトリ)の直下の
JSON
というディレクトリの下に、元のディレクトリ構造を保って格納される。
また、変換は、論理CPUの数に合わせて、並列に実行される。
なお、これを使用するには Perl の以下のモジュールが必要である。 - File::Find::rule (ファイルを検索するためのモジュール) - MCE (Many Core Engine; 並列に処理するためのモジュール)