関数呼出依存グラフに基づく イディオムの検索

関数呼出依存グラフに基づく
イディオムの検索
渥美 紀寿† 山本 晋一郎‡ 阿草 清滋†
†名古屋大学
工学研究科 情報工学専攻
‡愛知県立大学 情報科学部
背景
• 高級言語ではライブラリが提供
– 入出力,文字列操作,整列操作等
プログラム中に多くのライブラリが使用される
socket
atoi fseek
fopen getopt
malloc
ライブラリの組合せが定型化
ライブラリの利用
• man などマニュアルの参照
– 引数、返り値、機能などの詳細な説明
使い方がよくわからない
• 既存のソースコードから検索
– ライブラリに関係しないコードの存在
ライブラリの利用
• man などマニュアルの参照
– 引数、返り値、機能などの詳細な説明
使い方がよくわからない
• 既存のソースコードから検索
– ライブラリに関係しないコードの存在
もっとシンプルに
ライブラリに関係する部分のみが提示できないか?
目的
• 共通して用いられているライブラリの組合
せの検索
– ライブラリの典型的な利用例の提示
• 類似コードの検出(モジュール化候補)
– 保守作業の軽減
共通して用いられるライブラリの組合せ
||
イディオムの検索
目次
• 関数呼出依存グラフ
– データ依存関係、制御依存関係
• イディオム
– FCDGデータベースから検索
• デモ
• 評価
• まとめと今後の課題
目次
• 関数呼出依存グラフ
– データ依存関係、制御依存関係
• イディオム
– FCDGデータベースから検索
• デモ
• 評価
• まとめと今後の課題
関数呼出依存グラフ(FCDG)
• ライブラリの組み合わせを表現
– ライブラリ関数間のデータ依存関係
fp = fopen(); fclose(fp);
– ライブラリ関数と条件式の間のデータ依存関係
fp = fopen(); if (fp == NULL) { ... }
– 条件式とライブラリ関数間の制御依存関係
if (fp == NULL) { error(); }
データ依存関係
• データ依存関係
– 関数呼び出し f の戻り値が関数呼び出し g
の引数または条件式で利用
1.g ( … , f ( ), … ) ;
2.a = f ( ) ; … ; g ( … , a , … ) ;
fとgの間のデータ依存関係
3.a = f(); if (a == NULL) { ... }
4.if (f() == NULL) { ... }
fと条件式の間のデータ依存関係
制御依存関係
• 制御依存関係
– 条件式 c の真偽によって関数呼び出し f が
実行されるか否かが決まる場合
if ( c ) {
f( );
}
while ( c ) {
f ( );
}
cとfの間の制御依存関係
FCDG の例
fp = fopen( ... );
if (fp = = NULL) {
fprintf( ... );
exit( ... );
}
fclose(fp);
fopen
==
NULL
fclose
t
t
FCDG の例
fp = fopen( ... );
if (fp = = NULL) {
fprintf( ... );
exit( ... );
}
fclose(fp);
fopen
==
NULL
t
fclose
fprintf
exit
t
目次
• 関数呼出依存グラフ
– データ依存関係、制御依存関係
• イディオム
– FCDGデータベースから検索
• デモ
• 評価
• まとめと今後の課題
イディオムの検索
多くのプログラムで
利用されているFCDGの
パターン
||
既存のプログラム
イディオム
FCDG抽出
FCDG データベース
イディオムの検索
既存のプログラム
FCDG抽出
FCDG データベース
イディオム
多くのプログラムで利用されているFCDG
サブグラフが一致する場合
プログラム1 プログラム2
FCDG1はプログラム1
およびプログラム2で
用いられている
FCDG1
FCDG2
目次
• 関数呼出依存グラフ
– データ依存関係、制御依存関係
• イディオム
– FCDGデータベースから検索
• デモ
• 評価
• まとめと今後の課題
目次
• 関数呼出依存グラフ
– データ依存関係、制御依存関係
• イディオム
– FCDGデータベースから検索
• デモ
• 評価
• まとめと今後の課題
典型的な利用例
• FreeBSD /usr/src/usr.bin 以下の139のプロ
グラムを解析
$0 = getopt();
if ($0 ! = -1) {
...
}
$0 = malloc();
if ($0 = = NULL) {
....
}
$0 = getopt( );
if ($0 != -1) {
$1 = atoi( );
if ($1 < 0 ) {
}
}
rev,
uuencode,rupti
meなど92個の
プログラム
head, nl, systatなど brandelf, du
25個のプログラム 2個のプログラム
$0 = open();
if ($0 < 0) {
...
}
close($0);
cksum,ktrace
2個のプログラム
モジュール化候補コード
if ((hbuf = malloc(...)) == NULL) {
mfail(); /* ユーザ定義関数 */
return (1);
}
memset(...);
プログラムpr中に
4箇所存在
if ((flags = fctl(0, F_GETFL, 0) == -1) プログラムchat中に
4箇所存在
fatal(2, ...);
目次
• 関数呼出依存グラフ
– データ依存関係、制御依存関係
• イディオム
– FCDGデータベースから検索
• デモ
• 評価
• まとめと今後の課題
まとめ
• 定型化されたライブラリの組合せが存在
– FCDGを抽出し調査
• モジュール化候補コードの検出
– 同一プログラム内に同じイディオムの存在
今後の課題
• 関数を跨いだ依存解析
• プログラム開発においてイディオムの利用