第14回エンピリカルソフトウェア工学研究会 資料5 EASE研究の適用事例 コードクローン分析を利用した 類似バグ検出 2007年10月25日 パナソニックMSE㈱ ユビキタスネットワーク事業部 eソリューション開発グループ 佐々木健介 概要 ■背景 “クローン(複製)化されたコードと類似バグ” ■課題 “構造的欠陥の類似バグ検索手段は?” ■取組 “コード片検索ツールLibraの活用” ■実績・効果 ■今後の課題 “ツール性能評価と試行運用” “類似バグ検索とツール運用” 背景 “クローン(複製)化されたコードと類似バグ” コードクローン[Code Clone]とは? 『ソースコードに存在する全く同じ,あるいは類似したコード断片』 コピー&ペーストなどによるコード複製で生じる 良性要因 ・コード生成の効率向上 ・品質確保 悪性要因 ・バグのクローン(複製)化 ・保守性の低下 たとえば, コーディング後に コードクローン分析 クローン多い ライブラリ化 構造化見直し コードクローン(大阪大学) : http://sel.ist.osaka-u.ac.jp/research/clone/ CCfinderX(産総研 神谷氏): http://www.ccfinder.net/ccfinderx-j.html 背景 “クローン(複製)化されたコードと類似バグ” ■派生モデル開発でのクローン ベースモデルからの コード流用 ソースコードのクローン(複製) バグのクローン(複製)? バグ 背景 “クローン(複製)化されたコードと類似バグ” 同一装置内でも・・・ 類似機能,処理のコード流用 (ライブラリ化されずにコピー) ソースコードのクローン(複製) バグのクローン(複製)? 装置 バグ 流用 ベース バグ? バグ? クローン クローン クローン バグ? 背景 “クローン(複製)化されたコードと類似バグ” 開発現場での問題 システムの運用管理でも・・・ e l b a T t n e m e g a n a M システム障害 背景 “クローン(複製)化されたコードと類似バグ” 開発現場での問題 ソフトウェアの開発管理でも・・・ e l b a T t n e m e g a n a M バグ 背景 “クローン(複製)化されたコードと類似バグ” 開発現場での問題 たとえばこんな会話はありませんか? レビューで・・・ 「おそらく、派生モデルのXXXにも影響があります!」 「どんな調べ方をしたんだ? 間違いないのか?」 品質保証部門やお客様とのあいだで・・・ 「関連装置や機能はテスト済みです。」 「漏れは? 他に影響はないのか?」 背景 “クローン(複製)化されたコードと類似バグ” 類似バグを見つけたら 流出させたくない 確実にShootしたい 素早くShootしたい 背景 “クローン(複製)化されたコードと類似バグ” ■クローン化された潜在バグの検出 ・類似箇所は? ・影響範囲(装置/機能)は? ・旧いシステムの場合・・・、 ドキュメントの信頼性は? 詳しい担当者は? ドキュメントからの バグ追跡は 容易ではない 担当者知識や 力量に依存 バグ検出では・・・ 自動化されない 作業が含まれる 課題 “構造的欠陥の類似バグ検索手段は?” ■類似バグの考察 ■単純なバグの場合、 ソースコード上 では・・・ 文字列検索(grep等)での検出 ■構造的欠陥バグの場合、有効な手段は? ・特定の変数の問題ではない ・式の間違い,抜け ・構文、ロジックのミス コピー(複製)後、変数名が修正 文字列検索では検出も難しくなる 課題 “構造的欠陥の類似バグ検索手段は?” ■構造的欠陥バグ 文字列検索のキー “MAX” “Data” “moni” 検索結果は大量 “sig_cnt” 絞込みも難しく 労力も相応に必要! 課題 “構造的欠陥の類似バグ検索手段は?” ■単純なバグであっても検出が困難なケース バグ要因:ループ回数間違い CONST変数名が修正 元 文字列検索では検出不可 修正 先 for( i=0; i<=MAX_SU; i++) for( i=0; i<=M_CNT; i++) または 32(直値)など コピー { { mem = wkbuf; mem = wkbuf; } } 課題 “構造的欠陥の類似バグ検索手段は?” 理想的な検索手段は・・・?『構造検索がしたい!』 ・変数名を正規化して検索 ・構造(複数行に跨るコード片)検索 やりたい事 『コードクローン箇所の検出』 類似バグ検出精度向上 狙い 効率向上 [従来]grep組合せ/ドキュメント/ノウハウや記憶 良い検索手段は? ツールは無いか? 取組 “コード片検索ツールLibraの活用” ■コード片検索ツール“Libra”の活用 ※ コードクローン部検索目的に,EASEプロジェクト/奈良先端科学 技術大学院大学,大阪大学との共同検証作業を実施中(ツールは 大阪大学が所有) http://www.empirical.jp/ “Libra”の特徴 ・変数名を正規化 ・複数行ステートメントやコメントも関係なし ・言語依存あり(C/C++,Java, ・完全一致や半固定の調整も可能 COBOL,FORTRAN,等) 検索キー(コード片) 検出 if( (a < b) && (c > d) ) { mem1 = mem2; } 結果 if( (hhh < iii) && (jjj > kkk) ) { buf1 = buf2; 同一構造を } 検出 取組 “コード片検索ツールLibraの活用” 類似バグ修正の一般的な流れ ステップ1 発見されたバグの修正 ステップ3 ステップ2 ドキュメント不完全(?) ドキュメントに残る 記憶に頼る部分で 範囲での修正 修正必要!? if( ・・・ ・・・ ) Base.C if( ・・・ ・・・ ) Func1.C { { ??? continue; → break; continue; → break; } } 「ここは修正すべき!」 「他にはどこだ?」 コード片検索ツール Libraを導入 取組 “コード片検索ツールLibraの活用” 画面イメージ 初期画面 取組 “コード片検索ツールLibraの活用” 画面イメージ ファイル選択 取組 “コード片検索ツールLibraの活用” 画面イメージ 検索キー入力 取組 “コード片検索ツールLibraの活用” 画面イメージ 検索結果 見つかった クローン部 「どのモジュールに」 「いくつのクローン」 取組 “コード片検索ツールLibraの活用” ■コードクローンの実例 <1>C言語 タスク間流用/ 修正なし 取組 “コード片検索ツールLibraの活用” ■コードクローンの実例 <2>C言語 異なる装置間流用/ 修正なし 取組 “コード片検索ツールLibraの活用” ■コードクローンの実例 <3>C言語 派生モデル間流用/ 修正あり 取組 “コード片検索ツールLibraの活用” ■コードクローンの実例 <4>C言語 派生モデル間流用/ 修正あり 取組 “コード片検索ツールLibraの活用” ■コードクローンの実例 <5>Java 派生モデル間流用/ 修正あり(追加) 実績・効果 “ツール性能評価と試行運用” ■ツールの性能評価 運用の 前に・・・ 既に対応済みのバグを、 もし”ツールだったら、どれだけ検出できたか?” ・Win.系アプリ C++ 約13.5ks ・Win.系C/Sサブシステム Java 約 7.2ks ・68系組込みサブシステム C 約16.7ks 実績・効果 “ツール性能評価と試行運用” 「出典: 森崎 修司 "コードクローン分析による類似バグ検出“ http://empirical.jp/download/past/publicdata/13th_kenkyukai/2-2.pdf , エンピリカルソフトウェア工学研究会、2007/7/9」 性能評価の指標 適合率 : c/a(検索結果に修正すべき箇所が含まれていた割合) 再現率 : c/b(修正すべき箇所のうち検索結果が含まれていた割合) F1値 : 適合率と再現率のバランス(値が高いほどバランスがよい) a ツール検索結果 c 本来修正すべき 箇所 b 使えそう だ! 3タイプのプログラムで,73~89%の 再現率 実績・効果 “ツール性能評価と試行運用” ■実プロジェクトでの実績(1) [稼働中システムでの障害対応] UNIX/C 24.1ks このあとの処理で使用する, hoko と hoko2 が保存されずに 書き換えられていたことが, コード上の問題 このコード片を・・・ 実績・効果 “ツール性能評価と試行運用” ■実際のソースプログラム Libraの 検索画面で 検索キーに貼り付けて 実行すると・・・ 実績・効果 “ツール性能評価と試行運用” ■実際のソースプログラム 検索中・・・ “似た”コード片を検出 検索キー 実績・効果 “ツール性能評価と試行運用” ■実際のソースプログラム “似た”コード片を検出 検索キー 派生装置全4台から“似た”コード片を30箇所 うち15箇所が類似バグ 適合率50%,再現率(100%) 実績・効果 “ツール性能評価と試行運用” ■実プロジェクトでの実績(2) [開発中での既存バグ対応] UNIX/C 64.5ks データ範囲チェックが抜けていた ことがコード上の問題 不当値データ受信時に 不当アドレス参照させないため 実績・効果 “ツール性能評価と試行運用” ■実際のソースプログラム 検索キー “似た”コード片を検出 同一装置内から“似た”コード片を4箇所検出 4箇所すべてが類似バグ 適合率100%,再現率(100%) 実績・効果 “ツール性能評価と試行運用” ■定量的効果 ■ ■ ■ 精度 70~(100)%の再現率 実務での類似バグ検出 検索キーがコード片 (複数行の塊) = ○ 著しく短いステートメント = × ※ 結果が大量, 絞込みは現実的ではない 効率 検索時間短縮 [従来] 文字列検索5~6h → 5分程度(母体約25ks) 防止 ・障害発生時の対応(膨大) ・お客様へのご迷惑 不安感 『類似バグ?/潜在バグ?』 被害= 派生した数だけ! 印象悪い 実績・効果 “ツール性能評価と試行運用” ■他ユースケースでの応用と効果(予測) ・開発途中でのバグ対応 「作り終わったプログラムにも同じコード(バグ)あったはず・・・」 ・流用ベースのコード検索 どこだっけ? どこだっけ? 「ここの処理って流用できるコードをどこかで見たような・・・」 ・改修業務での改修箇所調査,洗い出し 改修機能の特定 改修箇所をコード上で確認 類似機能(処理)の調査 ・ドキュメント ・担当者の記憶 ・ソースコード (文字列検索) +検索ツール 修正漏れの 防止 今後の課題 “類似バグ検索とツール運用” ■目的の達成度 『構造的欠陥を持つ類似バグ検索に, 性能,コスト,手軽さ =現状“問題なし” コード片検索ツール“Libra”は一手段として使える』 ■“類似バグ検索“での課題 ・他手段の模索(他ツール,分析手法検討) ・“Libra”の継続運用と検証(成果累積,精度計測) ■ “Libra”継続運用での課題 ・検出プロセスの手順化,標準プロセスへの組み込み 探すのと,直すのは マニュアル整備 同じ作業 ・機能強化(オプション,統合開発環境への組み込み) 今後の課題 “類似バグ検索とツール運用” ■コードクローン分析の有用性 用途例:リファクタリング支援 ツール“Gemini(ジェミニ)”の活用 ・クローン分布状況,量把握(グラフ表示) ・クローン構造分析 ・リファクタリング箇所の特定、支援 今後の課題 “類似バグ検索とツール運用” ■ご紹介 ツール“Gemini(ジェミニ)” 画面イメージ 水平・垂直方向に ソースファイルを並 べ比較し、クローン 部をドット表示 クローン数,重複 度(%),クローン 関係ファイル数, 等を表示 黒く濃い部分 =クローン部 今後の課題 “類似バグ検索とツール運用” ■ご紹介 ツール“Gemini(ジェミニ)” C k! c li 画面イメージ 今後の課題 “類似バグ検索とツール運用” ■ご紹介 ツール“Gemini(ジェミニ)” C PMSEでは『未検証』 画面イメージ k! il c ・開発プロジェクト特性(小規模、短期間)や 開発プロセスにアンマッチ ・コストパフォーマンスの問題、等 利用の機会 ・シリーズモデル開発のベース見直し 量産品(家電,携帯電話,等) ・劣化コードの修繕 ・開発生産性の補足指標 ex:クローン生成量により,生産性が増減 コードクローン分析を利用した 類似バグ検出 事例紹介を終わります。 ご静聴ありがとうございました。 パナソニックMSE㈱ ユビキタスネットワーク事業部 eソリューション開発グループ
© Copyright 2024 ExpyDoc