関数の変更履歴と呼び出し関係に 基づいた開発履歴理解支援システム 中山 崇,松下 誠,井上 克郎 大阪大学大学院情報科学研究科
版管理システムCVS プロダクトの開発履歴を保存・提供するシステム 蓄積された開発履歴には将来の開発に活用できる情報が多く含まれる 以前の開発についてのより深い理解 他のソフトウェア開発への応用 リポジトリ:プロダクトの 開発履歴を格納するDB リビジョン:プロダクトの ある時点における状態 コミット リポジトリ チェックアウト 開発者 ブランチ:バグ修正などのために元の リビジョン列から分岐したリビジョン列 2004年5月14日
開発履歴閲覧システム 版管理システムに蓄積された開発履歴を視覚的に閲覧することが出来るシステム データの表示にWebブラウザを用いることで、GUIの為の新たなシステムの導入が不必要なものがある (例)CVSWeb, ViewCVS, Bonsai 開発履歴情報 Web ブラウザ 開発者 版管理システム CVS 開発履歴 閲覧システム 開発履歴情報の要求 Web ブラウザ 開発者 開発履歴情報の 取得・解析 2004年5月14日
開発履歴閲覧システムの利用目的 開発作業内容の理解 開発履歴理解における作業量の縮小 過去の開発作業を新たな開発に再利用するために、開発履歴を理解する必要がある 新規開発参加者は、現在どのように開発が行われているかを確認する必要がある 開発履歴理解における作業量の縮小 版管理システム単体では取得に多大な労力がかかる情報を手軽に取得したい 履歴情報を理解しやすい様式で表示させたい 2004年5月14日
研究の目的 既存の履歴閲覧システムにはいくつか問題点が存在する これらの問題点は開発者の作業効率の低下を招いている リビジョン検索が行えない 適切な関数定義を得ることが出来ない 複数のファイルの開発履歴をまとめて把握できない これらの問題点は開発者の作業効率の低下を招いている これらの問題点を解決することで、開発者の負担を減らし、生産性を挙げたい 開発者に必要な情報をわかりやすく提供する開発履歴 理解支援システムCREBASS (Cvs REpository Browse And Search System)を試作 2004年5月14日
既存の開発履歴閲覧システムの問題点 リビジョン検索機能を持たない 開発された時期を考慮した関数の参照元と定義を得ることが困難 開発履歴の再利用を困難にする 開発された時期を考慮した関数の参照元と定義を得ることが困難 過去のソースコード理解の障壁となる 開発履歴の追跡を単一ファイルでしか行えない 関連するファイルの開発履歴をまとめて追跡することが出来ない 2004年5月14日
既存の開発履歴閲覧システムの問題点1 リビジョン検索機能を持たない CVS リポジトリ 過去のリビジョンの 開発事例を新たな 開発に再利用したい 開発履歴情報から目的の リビジョンを探し出す 開発履歴情報群 膨大な履歴情報から手作業で目的の リビジョンを探し出すのは不可能 リビジョン検索機能がないと開発 履歴情報の利用が困難になる 2004年5月14日
既存の開発履歴閲覧システムの問題点2 ? 開発された時期を考慮した関数の参照元と定義を得ることが困難 CVSを用いた開発では過去のソースコードを 理解・編集することが多い (例)過去の安定バージョンからのバグ修正・過去のソースコードの再利用 ソースコード 開発者 ? 使用されている関数がどのような 定義になっているか知りたい 過去のソースコード理解の 大きな障壁となっている どのリビジョンの関数定義を参照 すればよいかがわからない 関数の定義元ファイル リビジョン番号 1.29 1.30 1.31 2004年5月14日
既存の開発履歴閲覧システムの問題点3 開発履歴の追跡を単一ファイルでしか行えない システムの一機能を複数のファイルで 実装することが多い その機能の開発履歴を追跡するにはそれらの ファイルの開発履歴をまとめて追跡する必要がある しかし既存の履歴閲覧システムでは 単一ファイルの履歴しか追跡できない 関連する複数のファイルの開発 履歴を追跡することが出来ない 既存の履歴 閲覧システム 2004年5月14日
既存システムの問題点への対策 既存の開発履歴閲覧システムでは開発者に必要な履歴情報を提供できていなかった これまで挙げた情報をわかりやすく提供する機能を実装することで開発者の負担を減らす リビジョン検索機能がない リビジョン検索機能・ヒストリ検索機能 関数の定義が得られない リビジョン関係を考慮した関数クロスリファレンス機能 複数のファイルをまとめて把握できない リビジョン・ヒストリ検索、プロジェクトの変遷のグラフ化機能 2004年5月14日
CREBASSの機能 リビジョン検索機能 リビジョン関係を考慮した関数クロスリファレンス機能 ヒストリイベント検索機能 必要な開発履歴情報を検索する リビジョン関係を考慮した関数クロスリファレンス機能 過去のリビジョンのソースコード理解を助ける ヒストリイベント検索機能 更新作業だけでなく、そのほかの作業の流れも把握する プロジェクトの変遷のグラフ化機能 各ファイル・ディレクトリ下のファイル群の変遷を視覚的に確認する 2004年5月14日
CREBASSの概要 ユーザインター フェース部 データベース部 DB 作成部 開発者 CVS リポジトリ チェックアウト・コミット 開発履歴情報の要求 開発履歴情報 の取得・解析 ユーザインター フェース部 CVS リポジトリ Web ブラウザ 開発履歴情報 開発履歴情報の解析 データベース部 関数定義・ 参照情報DB 関数定義・ 参照情報DB ヒストリ 情報DB プロジェクト リビジョン リビジョン 情報DB DB 作成部 ヒストリ 情報DB プロジェクト 情報DB 2004年5月14日
リビジョン検索機能 ユーザインター フェース部 データベース部 DB 作成部 開発者 CVS リポジトリ チェックアウト・コミット 開発履歴情報の要求 開発履歴情報 の取得・解析 ユーザインター フェース部 CVS リポジトリ Web ブラウザ 開発履歴情報 開発履歴情報の解析 データベース部 関数定義・ 参照情報DB 関数定義・ 参照情報DB ヒストリ 情報DB プロジェクト リビジョン リビジョン 情報DB DB 作成部 ヒストリ 情報DB プロジェクト 情報DB 2004年5月14日
リビジョン検索機能 あのユーザが あの機能に対して 行ったここ1週間の 更新作業を 検索したい あのファイルのコミット があった頃の開発 更新作業者 キーワード 更新日時 対象ディレクトリ 対象ブランチ あのユーザが あの機能に対して 行ったここ1週間の 更新作業を 検索したい あのファイルのコミット があった頃の開発 ブランチ上での更新 状況が知りたい 検索結果の ソートの仕方 ファイルパス リビジョン番号 更新日時 所属ブランチ名 ログメッセージ キーワード 更新作業者 2004年5月14日
リビジョン関係を考慮した関数クロスリファレンス機能 チェックアウト・コミット 開発者 開発履歴情報の要求 開発履歴情報 の取得・解析 ユーザインター フェース部 CVS リポジトリ Web ブラウザ 開発履歴情報 開発履歴情報の解析 データベース部 関数定義・ 参照情報DB 関数定義・ 参照情報DB ヒストリ 情報DB プロジェクト リビジョン リビジョン 情報DB DB 作成部 ヒストリ 情報DB プロジェクト 情報DB 2004年5月14日
リビジョン関係を考慮した関数クロスリファレンス機能 関数の参照箇所から、同時期に存在した定義へとジャンプする機能 対象はC言語 定義元を探す際には以下の点を考慮する 出来る限り参照元と同じブランチ上で定義元を探す 参照元のリビジョンの更新時刻を基準として参照先のリビジョンを決定する 2004年5月14日
リビジョン関係を考慮した関数クロスリファレンス機能 定義ファイル名の問い合わせ DH_free (cert->dh_tmp); s3_lib.c 1.57.2.8 OpenSSL_0_9_7-stable 2002/10/15 20:29:28 void DH_free (DH *r){ int i; if (r==NULL) return; dh_lib.c 1.28.2.2 OpenSSL_0_9_7-stable 2002/03/16 23:19:23 関数定義・ 参照情報DB リビジョンヒストリの問い合わせ 2002/10/15 定義元ファイルは crypto/dh/dh_lib.c 同じブランチ上の リビジョンから探す 日時を見て該当する リビジョンを探す crypto/dh/dh_lib.c この関数のこの時点 での定義が見たい dh_lib.cにおいて対応 するリビジョンはどれ? MAIN 2001/9/25 2002/3/9 2002/3/16 2003/1/30 1.29 1.30 1.31 OpenSSL_0_9_7-stable 1.28 1.28.2.1 1.28.2.2 1.28.2.3 2004年5月14日
ヒストリイベント検索・表示機能 ユーザインター フェース部 データベース部 DB 作成部 開発者 CVS リポジトリ チェックアウト・コミット 開発者 開発履歴情報の要求 開発履歴情報 の取得・解析 ユーザインター フェース部 CVS リポジトリ Web ブラウザ 開発履歴情報 開発履歴情報の解析 データベース部 関数定義・ 参照情報DB 関数定義・ 参照情報DB ヒストリ 情報DB プロジェクト リビジョン リビジョン 情報DB DB 作成部 ヒストリ 情報DB プロジェクト 情報DB 2004年5月14日
ヒストリイベントの検索・表示機能 ヒストリイベント:ファイルのコミットや タグ付けなどの、リポジトリに対して 起こったユーザによるアクション 検索するイベントの指定 イベントを起こしたユーザの指定 検索する期間の指定 検索するディレクトリの指定 検索結果は時系列 で表示される 同時に起こったと 考えられるイベント はまとめて表示する 2004年5月14日
プロジェクトの変遷のグラフ化機能 ユーザインター フェース部 データベース部 DB 作成部 開発者 CVS リポジトリ チェックアウト・コミット 開発者 開発履歴情報の要求 開発履歴情報 の取得・解析 ユーザインター フェース部 CVS リポジトリ Web ブラウザ 開発履歴情報 開発履歴情報の解析 データベース部 関数定義・ 参照情報DB 関数定義・ 参照情報DB ヒストリ 情報DB プロジェクト リビジョン リビジョン 情報DB DB 作成部 ヒストリ 情報DB プロジェクト 情報DB 2004年5月14日
プロジェクトの変遷のグラフ化機能 あるファイル、もしくはディレクトリ下の全てのファイルについて以下の項目の変遷を表したグラフを作成する 総行数 編集量 累計commiter数 複数の対象を1つのグラフに表示することで、互いに比較を行うことが出来る 編集量の変遷を表したグラフ (上は書き足された行数、下は削除された行数) 対象に対してコミットを行ったユーザ の累計数の変遷を表したグラフ 総行数の変遷を表したグラフ 2004年5月14日
適用事例 OpenSSLの開発から得られたデータを用いる CVSリポジトリ:OpenSSL開発で蓄積された開発履歴 ファイル総数:3556 リビジョン総数:43684 実験の対象としてOpenSSLの開発における、2003年3月17日にリリースされた、セキュリティの修正事例をもとに検証を行う RSA blindingがオンになっていないとき、RSAキーに対してタイミング攻撃を受けやすい この脆弱性をどのようにして修正したかを知りたい 2004年5月14日
RSA blindingをデフォルトでオンにした 適用事例 RSA blindingをデフォルトでオンにした 2003年3月15日から同20日までにコミットされ、 かつキーワードRSAを持つリビジョンを検索する 2004年5月14日
blindingをデフォルトでオンにした 適用事例 タイミング攻撃を回避するためにRSA blindingをデフォルトでオンにした このコミットがRSA blindingの 脆弱性を修正するためのもの だということがわかった このファイルの修正内容を確認するために 直前のリビジョンからの差分を閲覧する 2004年5月14日
適用事例 しかしこれらの関数の情報 についてはわからなかった 関数クロスリファレンサを 用いて定義を調べる 新たに定義された関数とマクロを用いてRSA blinding のデフォルトでの機能使用を可能にしている 2004年5月14日
適用事例 修正箇所周辺の実装の詳細 を取得することが出来た クリックしてリンク先を表示 CRYPTO_w_lockはCRYPTO_lockの マクロであることがわかった CRYPTO_lockの定義が得られた さらにクリックしてCRYPTO_lockの定義を調べる 修正箇所周辺の実装の詳細 を取得することが出来た 2004年5月14日
適用事例の考察 リビジョン検索機能とクロスリファレンス機能を用いて開発者に必要な履歴情報の検索と理解が出来た 同じことを既存のシステムでやろうとするとどうなるか CVSWebの場合 リビジョン検索機能が無いため、必要な履歴情報を探し出すのが非常に困難 ViewCVS・Bonsaiの場合 リビジョン検索はあるが、ログメッセージに関する検索が出来ないため、知りたいトピックに関する更新情報を探し出すのは困難 該当するリビジョンが参照する関数の定義を得る方法が無いため、該当リビジョンのソースコードを理解するのが困難 2004年5月14日
まとめと今後の課題 版管理システムのリビジョン情報を解析して、開発履歴情報の閲覧・検索を行い、ユーザの開発履歴理解を支援するシステムCREBASSを作成した 実際のソフトウェア開発で蓄積された履歴情報を用いて適用実験を行い、目的の開発履歴情報の閲覧・検索が行えることを確認した リビジョン検索の際に用いるキーワードの抽出の精度向上 関数の参照先を特定する精度の向上 より大規模なリポジトリでの適用実験 2004年5月14日