Download - 関数呼出依存グラフを用いた ライブラリの用例検索

Transcript
Page 1: 関数呼出依存グラフを用いた ライブラリの用例検索

関数呼出依存グラフを用いたライブラリの用例検索

名古屋大学 工学研究科計算理工学専攻 阿草研究室

渥美 紀寿

Page 2: 関数呼出依存グラフを用いた ライブラリの用例検索

背景

• 高級言語ではライブラリが提供– 入出力,文字列操作,整列操作等

• ライブラリの知識が必要– マニュアルの参照– 既存のソースコードから文字列検索

プログラム中に多くのライブラリライブラリが使用される

Page 3: 関数呼出依存グラフを用いた ライブラリの用例検索

マニュアルの参照

パラメータ sはソケットです。このタイプが SOCK_DGRAM の場合、この呼び出しはソケットが結び付けられる通信相手を指定します。このアドレスは送信データグラムの送信先であり、受信データグラムの送信元となる唯一のアドレスです。ソケットのタイプが SOCK_STREAM の場合、この呼び出しは通信相手のソケットに接続を確立しようとします。

(例)ライブラリ関数 connect 第一引数に関する説明

どのように使ったら良いのか

わからない

実際にはライブラリ関数 socket の返り値を与える

Page 4: 関数呼出依存グラフを用いた ライブラリの用例検索

finger/net.c: if (Tflag && connect(s, (struct sockaddr *)&sin, ftp/cmds.c: disconnect(0, 0);ftp/fetch.c: if (connect(s, res->ai_addr, res->ai_addrlen) < 0) {ftp/fetch.c: disconnect(0, NULL);ftp/fetch.c: disconnect(0, NULL);

既存のソースコードから文字列による検索

if ((s = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0) { perror("finger: socket"); return; }

if (Tflag && connect(s, (struct sockaddr *)&sin, sizeof (sin))) { perror("finger: connect"); return; }

結果が膨大な量

同じ用法を何度も参照

Page 5: 関数呼出依存グラフを用いた ライブラリの用例検索

目的

• ライブラリの用法を調べる手段– マニュアルの参照

– 既存のソースコードから用例検索

マニュアルを参照しただけでは得られない情報がある

文字列検索では同じ用法を区別できない

用法によって用例を分類し,効率よく検索したいライブラリの組み合わせを用法として捉える

Page 6: 関数呼出依存グラフを用いた ライブラリの用例検索

関数呼出依存グラフ( FCDG )

• ライブラリの組み合わせを表現するものとして関数呼出依存グラフを提案– ライブラリ関数間のデータ依存関係– ライブラリ関数と条件式の間のデータ依存

関係– 条件式とライブラリ関数間の制御依存関係

Page 7: 関数呼出依存グラフを用いた ライブラリの用例検索

データ依存関係

• データ依存関係データ依存関係 – 関数呼び出し f の戻り値が関数呼び出し g の引数となっている場合

1.g ( … , f ( ), … ) ;

2.a = f ( ) ; … ; g ( … , a , … ) ;

3.a = f(); if (a == NULL) { ... }

f と g の間のデータ依存関係

f と 条件式 の間のデータ依存関係

Page 8: 関数呼出依存グラフを用いた ライブラリの用例検索

制御依存関係

• 制御依存関係制御依存関係– 条件式 c の真偽によって関数呼び出し f

が実行されるか否かが決まる場合

if ( c ) { f( );}

while ( c ) { f ( );}

c と f の間の制御依存関係

Page 9: 関数呼出依存グラフを用いた ライブラリの用例検索

= =NULL

= =NULL

fprintf

exit

fclosefclose

= =NULL

fopen

FCDG の例

fopen

fprintf

exit

tt

fp = fopen( ... );if (fp = = NULL) { fprintf( ... ); exit( ... );}fclose(fp);

Page 10: 関数呼出依存グラフを用いた ライブラリの用例検索

部分 FCDG

• FCDG– 複数の機能が組み合わされている

特定のライブラリに着目した場合そのライブラリに関する機能のみを抽出

部分 FCDG

注目している関数に特化した注目している関数に特化した FCDGFCDG が必要が必要

Page 11: 関数呼出依存グラフを用いた ライブラリの用例検索

fopen を含むFCDG の中で(fopen, !=NULL)(fopen, fclose)の組み合わせが多く存在

部分 FCDG の例

fopen

fseek

fclose

getc

putchar

!=NULL

!=EOF

! =0

t

t

注目しているライブラリ関数 getc

!=EOF

putchar

fopen

fclose

!=NULL

Page 12: 関数呼出依存グラフを用いた ライブラリの用例検索

用法による用例の分類

FCDG データベース

部分 FCDG

部分 FCDG による分類

部分 FCDG を用法として捉える

テンプレートコード

テンプレートコードにより用法を提示

Page 13: 関数呼出依存グラフを用いた ライブラリの用例検索

ライブラリの用例検索

ソースコードデータベース

FCDGデータベース

ソースコード

FCDG

コード断片

部分 FCDG

テンプレートコード

コード断片コード断片

Page 14: 関数呼出依存グラフを用いた ライブラリの用例検索

部分 FCDG による分類

fopenfgets

fclose

fopenperror

exit

fopenfclose

fopen関数呼出依存グラフに含まれる関数名

132226同じ関数呼出依存グラフの割合

FreeBSD 4.3-STABLE の /usr/bin 以下のコマンドのソースプログラムの関数呼出依存グラフデータベースを基にfopen を検索した結果

Page 15: 関数呼出依存グラフを用いた ライブラリの用例検索

まとめ

• ライブラリの用例検索の必要性• ライブラリに関する依存関係• ライブラリの組み合わせの取得

– 関数呼出依存グラフ• 用法による分類

– 適度な単位で分類できた

効率的に用例を検索できる

Page 16: 関数呼出依存グラフを用いた ライブラリの用例検索

今後の課題

• 関数を跨いだ依存解析• 類似した関数呼出依存グラフ

– 部品化• ドキュメントとの対応• プログラム理解支援環境への適用

– 関数から取得された関数呼出依存グラフの類似性