識別子の共起関係に基づく 類似コード検索法の提案と 欠陥検出への適用 大阪大学 大学院情報科学研究科 服部 剛之,吉田 則裕,早瀬 康裕, 肥後 芳樹,松下 誠,楠本 真二, 井上 克郎 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 1 概要 キーワードを自動的に抽出し,類似コードを検 索する手法を提案する grep等のキーワード検索では,適切なキーワードを 決めるために対象ソフトウェアの知識が必要 ソースコードの一部を与えることで,キーワードを自 動的に抽出 識別子の共起関係を利用 提案手法を欠陥検出に適用し,実験を行った Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 2 目次 研究の背景 欠陥の修正 類似コード検索 研究の目的とアプローチ 提案手法の説明 手法の概要 作成したシステムの説明 適用実験 欠陥検出への適用 まとめと今後の課題 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 3 欠陥の修正 ソフトウェア保守作業の効率化が重要な課題 ソフトウェアには,コピーアンドペーストによって生成さ れたソースコードが存在 ソフトウェア保守の際に,複数箇所に同様の修正を加える必 要が生じることがある 同様の欠陥が存在する箇所を特定する方法が必要 ソースコードの一部が 類似した箇所が存在 同様の欠陥が存在 欠陥が存在 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 4 類似コード検索(1/2) ソースコードの集合から,一致もしくは類似した コード片(ソースコードの断片)を検索する クエリ(検索質問)を与えることで検索を行う 検索結果 ソースコードの集合 ユーザ 類似コード検索 クエリを指定 クエリ 一致もしくは類似したコード片 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 5 類似コード検索(2/2) ソースコードの集合から,一致もしくは類似した コード片(ソースコードの一部)を検索する クエリ(検索質問)を与えることで検索を行う キーワードをクエリとして与える方法 例)grep コード片をクエリとして与える方法 例)コードクローン検索ツール Libra[1] [1] 泉田聡介,植田泰士,神谷年洋,楠本真二,井上克郎, “ソフトウェア保守のための類似コード検査ツール”, 電子情報通信学会論文誌,Vol.J-86-D-I(No.12):pp.906–908,2003. Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 6 grepを用いた類似コード検索 手順 ユーザがコード片からキーワードを発見する 2. grepによって,キーワードが出現する箇所を検出する 3. 検出した箇所を基にキーワードを含むコード片を特定する 1. 利点 名前などの識別子の情報が利用可能 問題点 適切なキーワードを発見することが困難 対象のソースコード集合に対する知識が必要 同義語などのキーワードの変化形を検出することが困難 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 7 Libraを用いた類似コード検索 手順 1. 2. 利点 ユーザがコード片をクエリとして与える コードクローン検出ツールCCFinder[2]を用いてクエリのコードクローン を検出する キーワードを考えなくても検索が可能 キーワードの変化形にも対応可能 問題点 クエリとコードクローンの関係にある類似コードしか検出できない コード片の挿入,削除などの差異があると検出できない [2] T. Kamiya, S. Kusumoto, and K. Inoue, "CCFinder: A multi-linguistic token-based code clone detection system for large scale source code", IEEE Transactions on Software Engineering, Vol.28(No.7):pp.654–670, 2002. Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 8 研究の目的とアプローチ 目的 キーワードの発見を自動的に行い,類似コードの検索を行う キーワードの変化形も考慮する アプローチ 識別子の共起関係を利用することで,コード片からキーワー ド,キーワードの変化形を自動的に抽出する 入力 ソースコードの集合 クエリとして与えるコード片 提案手法 出力 抽出部 キーワード等の抽出 照合部 類似コードの検索 クエリと類似した コード片の集合 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 9 提案手法の概要(1/2) 抽出部 クエリとして与えられたコード片から,コード片を特徴付ける 識別子(特徴語)を求める 2. ソースコード集合から,クエリとして与えられたコード片と特 徴語が同じ,もしくは特徴語が類似したコード片を抽出する 1. クエリとして与えられたコード片 特徴語 … host = host_alloc( ... ); log ( ... ); if (!add_host(host)) { // scan_host(host) // is missing! } … 手法が抽出したコード片 … node = node_alloc( ... ); if ( ... == 0){ return; } if (!add_node(node)) { // scan_node(node) // is missing! } … 特徴語 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 10 提案手法の概要(2/2) 照合部 クエリとして与えられたコード片と手法が抽出したコード片に 対して,特徴語を含む文の集合を比較する 2. 特徴語を含む文の構文情報が一致した場合,クエリとして与 えられたコード片と類似したコード片として検出する 1. クエリとして与えられたコード片 手法が抽出したコード片 … … node = node_alloc( ... ); host = host_alloc( ... ); log ( ... ); 構文情報が一致 if ( ... == 0){ return; 類似したコード片 if (!add_host(host)) { } // scan_host(host) if (!add_node(node)) { // is missing! // scan_node(node) } // is missing! … } … Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 11 作成したシステムの概略図 識別子情報の抽出 ソースコードの集合 抽出部 識別子の同義語の導出 クエリ 特徴的な箇所の抽出 構文情報の取得 照合部 ユーザ ユーザが行単位で コード片を選択 特徴的な箇所の構文の比較 ユーザが与えたコード片と類似した コード片を持つモジュールのリスト Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 12 識別子情報の抽出 ソースコードの集合からモジュール単位で識別 子を抽出する 予約語,型名を表す識別子は除外 モジュールごとに識別子の出現回数を計算する 識別子情報 識別子名 対象モジュール 出現回数 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 13 識別子の同義語の導出 識別子の共起関係に基づいて,識別子のクラス タリングを行う 識別子の共起回数の分布が類似している場合,同じ クラスタに含まれる Jensen-Shannon divergence[3]を用いて,類似度を表す 同じクラスタに属する識別子を同義語と定義する 例) 識別子aと識別子bの共起回数の分布 識別子a 識別子b 識別子c 識別子d 識別子e 識別子a a1 a2 a3 a4 識別子b b1 b2 b3 b4 a2,a3,a4とb2,b3,b4が類似している場合,識別子aと識別子bを同義語とする [3] I. Dagan, L. Lee, and F. C. N. Pereira, "Similarity-based models of word cooccurrence probabilities", Machine Learning, Vol.34(No.1-3):pp.43–69, 1999. Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 14 特徴的な箇所の抽出 モジュールごとに特徴語を求める モジュール単位で閾値を定める ソースコード集合固有の基準値をモジュールの規模に応 じて正規化する 識別子の出現回数が閾値を上回る場合,そのモジ ュールにおける特徴語と設定した モジュール中の特徴語を含む行を特徴的な箇 所と設定した 照合部で比較を行う対象として用いる Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 15 作成したシステムの概略図 識別子情報の抽出 ソースコードの集合 抽出部 識別子の同義語の導出 クエリ 特徴的な箇所の抽出 構文情報の取得 照合部 ユーザ ユーザが行単位で コード片を選択 特徴的な箇所の構文の比較 ユーザが与えたコード片と類似した コード片を持つモジュールのリスト Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 16 構文情報の取得 入力コード片から特徴的な箇所を抽出する それぞれの特徴的な箇所において,構文情報 を取得する 構文情報の設定 出現している特徴語の集合 文の種類 変数宣言などの宣言文 条件文,繰り返し文などの条件節 break文,return文などの補助制御文 それ以外の文 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 17 特徴的な箇所の構文の比較(1/2) 入力コード片と各モジュールについて,特徴的な箇所 の構文情報を比較する 構文情報の対応付けを行う 同義語 特徴語が一致もしくは同義語の関係にある {host_alloc, node_alloc} {add_host, add_node} 文の種類が一致する 特徴語が同義語の関係 比較対象 文の種類が一致 … … node = node_alloc( ... ); host = host_alloc( ... ); if ( ... == 0){ log ( ... ); return; if (!add_host(host)) { } // scan_host(host) if (!add_node(node)) { // is missing! // scan_node(node) 特徴語が同義語ではない } 文の種類が一致しない // is missing! … } … 入力コード片 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 18 特徴的な箇所の構文の比較(2/2) 構文情報の対応付けの状態によって,類似し たコード片を含むモジュールを検出する 入力コード片の特徴的な箇所の構文情報すべてが, 対応付け可能である場合 入力コード片 比較対象 … … node = node_alloc( ... ); host = host_alloc( ... ); log ( ... ); 対応付け可能 if ( ... == 0){ return; if (!add_host(host)) { 類似したコード片を含むモジュール } // scan_host(host) if (!add_node(node)) { // is missing! // scan_node(node) } // is missing! … } … Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 19 適用実験目次 実験概要 実験対象 日本語入力システム かんな ソフトウェア部品検索システム SPARS-J 実験の設定 クラスタリングの閾値 入力コード片 評価基準 実験結果 考察 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 20 実験概要 実験対象に存在している欠陥の箇所をクエリとする クエリと同じ欠陥を含むコード片がどの程度検出され ているか調べる コード片の1つを クエリとして与える 同じ欠陥を含む コード片の集合 提案手法 クエリ 検出できた数を調べる クエリと類似したコード片を 持つモジュール Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 21 実験対象 日本語入力システム かんな Version3.6,Version3.6p1間でバッファのオーバー フローを検出するコードが追加された コードが追加される箇所を欠陥の箇所とした ソフトウェア部品検索システム SPARS-J 複数の関数において型キャストの追加が行われた 2004/5/27で同時に修正が行われている 型キャストの追加が行われる箇所を欠陥の箇所とした モジュールの単位を関数単位とした Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 22 実験の設定(クラスタリングの閾値) 同義語を求める際のクラスタリングの閾値を変化させて実験を 行った クラスタリングの閾値を求める手順 1. 2. 共起回数の分布の差異をクラスタ間距離とする 初期状態のクラスタ間距離の最大値を求める 1の値のx%を閾値とする Xを0%~100%まで10%刻みに変化させ実験を行った 例)初期状態のクラスタ間距離の分布 クラスタa クラスタb クラスタc クラスタd 1 クラスタa 2 4 3 5 クラスタb クラスタc クラスタd - 割合を50%に設定した場合, 閾値は6×0.5=3となる 6 - Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 23 実験の設定(入力コード片) 後のバージョンで修正が行われる箇所とその 前後合わせて3行を入力のコード片とする 入力コード片の総数 かんな:21個 SPARS-J:75個 修正前 修正後 修正箇所 key.data = package; key.size = size + 1; key.data = package; key.size = (u_int32_t)(size + 1); /* Acquire a cursor for the database. */ dbcp = get_cursor(&DBlist[PACKAGEDB]); /* Acquire a cursor for the database. */ dbcp = get_cursor(&DBlist[PACKAGEDB]); 修正が行われる箇所の前後1行ずつを 追加して3行を入力コード片とする Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 24 評価基準 それぞれの入力コード片について,適合率,再 現率を求めた 正解集合は実験対象で述べた欠陥を含むコード片 とした × 100 (%) 適合率: システムが検出した正解集合のコード片を含む関数の数 システムが検出した関数の数 × 100 (%) 再現率: システムが検出した正解集合のコード片を含む関数の数 正解集合のコード片を含む関数の総数 正解集合の関数 システムが検出した関数 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 25 実験結果 かんな SPARS-J 入力コード片の 適合率の平均 入力コード片の 再現率の平均 0% 8.05% 0.36% 18.55% 10% 22.67% 18.28% 39.45% 81.95% 20% 7.01% 87.19% 30% 21.09% 100.00% 30% 7.33% 88.31% 40% 9.64% 100.00% 40% 7.33% 88.31% 50% 9.64% 100.00% 50% 7.33% 88.31% 60% 9.55% 100.00% 60% 7.23% 89.53% 70% 9.55% 100.00% 70% 7.23% 89.53% 80% 9.55% 100.00% 80% 7.23% 89.53% 90% 9.55% 100.00% 90% 7.23% 89.53% 100% 9.55% 100.00% 100% 7.23% 89.53% 閾値として 設定した割合 入力コード片の 適合率の平均 入力コード片の 再現率の平均 0% 17.03% 5.51% 10% 89.86% 20% 閾値として 設定した割合 適合率は低いが,20%以降高い再現率が得られた Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 26 結果と考察 入力コード片の再現率の平均が高い値となっていた 欠陥を漏れなく検出することが要求される条件下では,提案 手法は有効 入力コード片の適合率の平均は低い値となっていた 欠陥が含まれていなくても,同じ構文であれば欠陥を含むコ ード片と判定されてしまう 欠陥と関係がないコード片を除外することが必要 閾値として設定した割合が,10%~20%の間で再現 率が大きく変化している 閾値の基準となる値を設定できると期待される Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 27 まとめ 識別子の共起関係に基づいて類似コード片を 検索する手法を提案 コード片から自動的にキーワードを発見 同義語を用いて,キーワードの変化形にも対応 提案手法を欠陥検出に適用し,実験を行った 実験対象はC言語のソフトウェア かんな SPARS-J 適合率は低いが,再現率は高い結果 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 28 今後の課題 出力結果を分類して評価を行う必要がある 同じ欠陥を含むモジュール 処理内容が同じで欠陥を含まないモジュール 異なる処理内容のモジュール 他のプログラミング言語で開発されたソフトウェアを対象とした 実験を行う必要がある 特徴語検出における閾値の妥当性を評価する必要がある 構文情報の対応付けを行った効果について,評価する必要が ある Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 29
© Copyright 2025 ExpyDoc