コードクローン分析を利用した 類似バグ検出 - easeプロジェクト

第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ソリューション開発グループ