関数呼出依存グラフに基づく イディオムの検索 渥美 紀寿† 山本 晋一郎‡ 阿草 清滋† †名古屋大学 工学研究科 情報工学専攻 ‡愛知県立大学 情報科学部 背景 • 高級言語ではライブラリが提供 – 入出力,文字列操作,整列操作等 プログラム中に多くのライブラリが使用される 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を抽出し調査 • モジュール化候補コードの検出 – 同一プログラム内に同じイディオムの存在 今後の課題 • 関数を跨いだ依存解析 • プログラム開発においてイディオムの利用
© Copyright 2024 ExpyDoc