関数呼出依存グラフを用いた ライブラリの用例検索 名古屋大学 工学研究科 計算理工学専攻 阿草研究室 渥美 紀寿 背景 • 高級言語ではライブラリが提供 – 入出力,文字列操作,整列操作等 プログラム中に多くのライブラリが使用される • ライブラリの知識が必要 – マニュアルの参照 – 既存のソースコードから文字列検索 マニュアルの参照 (例)ライブラリ関数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 の 引数となっている場合 1. g ( … , f ( ), … ) ; 2. a = f ( ) ; … ; g ( … , a , … ) ; f と g の間のデータ依存関係 3. a = f(); if (a == NULL) { ... } f と 条件式 の間のデータ依存関係 制御依存関係 • 制御依存関係 – 条件式 c の真偽によって関数呼び出し f が実行 されるか否かが決まる場合 if ( c ) { f( ); } while ( c ) { f ( ); } c と f の間の制御依存関係 FCDGの例 fp = fopen( ... ); if (fp = = NULL) { fprintf( ... ); exit( ... ); } fclose(fp); fopen == NULL t fclose fprintf exit t 部分FCDG • FCDG – 複数の機能が組み合わされている 特定のライブラリに着目した場合 そのライブラリに関する機能のみを抽出 注目している関数に特化したFCDGが必要 部分FCDG 部分FCDGの例 fopenを含む FCDGの中で (fopen, !=NULL) (fopen, fclose) の組み合わせが 多く存在 fopen != NULL fseek != 0 t getc fclose t 注目しているライブラリ関数getc putchar != EOF 用法による用例の分類 部分FCDGによる分類 テンプレート コード 部分FCDG FCDGデータベース 部分FCDGを用法として捉える テンプレートコードにより 用法を提示 ライブラリの用例検索 ソースコード コード断片 コード断片 コード断片 ソースコード データベース テンプレート コード FCDG データベース FCDG 部分FCDG 部分FCDGによる分類 FreeBSD 4.3-STABLEの/usr/bin以下のコマンドのソース プログラムの関数呼出依存グラフデータベースを基に fopen を検索した結果 同じ関数呼出 依存グラフの 割合 関数呼出依 存グラフに含 まれる関数名 26 22 13 9 fopen fopen fclose fopen perror exit fopen fgets fclose まとめ • ライブラリの用例検索の必要性 • ライブラリに関する依存関係 • ライブラリの組み合わせの取得 – 関数呼出依存グラフ • 用法による分類 – 適度な単位で分類できた 効率的に用例を検索できる 今後の課題 • 関数を跨いだ依存解析 • 類似した関数呼出依存グラフ – 部品化 • ドキュメントとの対応 • プログラム理解支援環境への適用 – 関数から取得された関数呼出依存グラフ の類似性
© Copyright 2024 ExpyDoc