160 likes | 266 Views
関数呼出依存グラフを用いた ライブラリの用例検索. 名古屋大学 工学研究科 計算理工学専攻 阿草研究室 渥美 紀寿. 背景. 高級言語ではライブラリが提供 入出力,文字列操作,整列操作等 ライブラリの知識が必要 マニュアルの参照 既存のソースコードから文字列検索. プログラム中に多くの ライブラリ が使用される. マニュアルの参照. (例)ライブラリ関数 connect 第一引数に関する説明.
E N D
関数呼出依存グラフを用いたライブラリの用例検索関数呼出依存グラフを用いたライブラリの用例検索 名古屋大学 工学研究科 計算理工学専攻 阿草研究室 渥美 紀寿
背景 • 高級言語ではライブラリが提供 • 入出力,文字列操作,整列操作等 • ライブラリの知識が必要 • マニュアルの参照 • 既存のソースコードから文字列検索 プログラム中に多くのライブラリが使用される
マニュアルの参照 (例)ライブラリ関数connect第一引数に関する説明 パラメータsはソケットです。このタイプがSOCK_DGRAM の場合、この呼び出しはソケットが結び付けられる通信相手を指定します。このアドレスは送信データグラムの送信先であり、受信データグラムの送信元となる唯一のアドレスです。ソケットのタイプが SOCK_STREAM の場合、この呼び出しは通信相手のソケットに接続を確立しようとします。 どのように使ったら良いのか わからない 実際にはライブラリ関数socketの返り値を与える
既存のソースコードから文字列による検索 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; }
目的 • ライブラリの用法を調べる手段 • マニュアルの参照 • 既存のソースコードから用例検索 マニュアルを参照しただけでは得られない情報がある 文字列検索では同じ用法を区別できない 用法によって用例を分類し,効率よく検索したい ライブラリの組み合わせを用法として捉える
関数呼出依存グラフ(FCDG) • ライブラリの組み合わせを表現するものとして関数呼出依存グラフを提案 • ライブラリ関数間のデータ依存関係 • ライブラリ関数と条件式の間のデータ依存関係 • 条件式とライブラリ関数間の制御依存関係
データ依存関係 • データ依存関係 • 関数呼び出しf の戻り値が関数呼び出しg の引数となっている場合 • g ( … , f ( ), … ) ; • a = f ( ) ; … ; g ( … , a , … ) ; • a = f(); if (a == NULL) { ... } f と g の間のデータ依存関係 f と 条件式 の間のデータ依存関係
制御依存関係 • 制御依存関係 • 条件式 c の真偽によって関数呼び出しfが実行されるか否かが決まる場合 while ( c ) { f ( ); } if ( c ) { f( ); } c と f の間の制御依存関係
FCDGの例 fp = fopen( ... ); if (fp = = NULL) { fprintf( ... ); exit( ... ); } fclose(fp); fopen fopen = = NULL = = NULL = = NULL t t fclose fclose fprintf fprintf exit exit
注目している関数に特化したFCDGが必要 部分FCDG 部分FCDG • FCDG • 複数の機能が組み合わされている 特定のライブラリに着目した場合 そのライブラリに関する機能のみを抽出
部分FCDGの例 fopenを含む FCDGの中で (fopen, !=NULL) (fopen, fclose) の組み合わせが 多く存在 fopen fopen t != NULL != NULL fseek getc ! = 0 != EOF != EOF fclose fclose t putchar putchar 注目しているライブラリ関数getc
用法による用例の分類 部分FCDGによる分類 テンプレート コード 部分FCDG テンプレートコードにより 用法を提示 FCDGデータベース 部分FCDGを用法として捉える
コード断片 コード断片 コード断片 ライブラリの用例検索 ソースコード ソースコード データベース テンプレート コード FCDG データベース 部分FCDG FCDG
同じ関数呼出依存グラフの割合 26 22 13 9 関数呼出依存グラフに含まれる関数名 fopen fopen fclose fopen perror exit fopen fgets fclose 部分FCDGによる分類 FreeBSD 4.3-STABLEの/usr/bin以下のコマンドのソース プログラムの関数呼出依存グラフデータベースを基に fopen を検索した結果
まとめ • ライブラリの用例検索の必要性 • ライブラリに関する依存関係 • ライブラリの組み合わせの取得 • 関数呼出依存グラフ • 用法による分類 • 適度な単位で分類できた 効率的に用例を検索できる
今後の課題 • 関数を跨いだ依存解析 • 類似した関数呼出依存グラフ • 部品化 • ドキュメントとの対応 • プログラム理解支援環境への適用 • 関数から取得された関数呼出依存グラフの類似性