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