スライド 1

Angelic Debugging
東京工業大学 権藤研究室 10M38102 栗田 剛
1
Angelic Debugging
目的: バクの可能性がある場所(修正候補)の特定
「 Angelic Debugging 」では修正候補を自動計算する



ここで自動計算するのは「構文」ではなく「値」



正しい構文を考えるのはコストが高い
(正しく動作するのに必要な)正しい値を計算する方が容易
テストが通る値が見つかった時、その式を修正候補とする

「式」は「値」を導出するため、「(エラーを起こす)式から導出される
値」の代わりに「正しい値」が分かれば、その式を直すべきとわかる
この手法の特徴・利点




2
プログラマの労力が減る: コンピュータの性能に任せる
テストに使う入力をそのまま活用している
手法を自動化し、大小のJavaプログラムでテストした
Angelic Debuggingの詳細
次の手順によりバグの修正を行う

1.
(プログラマが)バグが含まれそうな箇所を特定する

2.
(コンピュータが)その箇所を検証する


3.
修正すると別のテストが通らなくなるような修正候補を除外
(プログラマが)修正候補に対して最適な式を考える


3
スコープ内の式すべてを計算し、もっともらしい修正候補を抽出
修正候補の箇所と同時に、テストを通すことができる値が得られる
(コンピュータが)修正候補を絞り込む

4.
その箇所を「スコープ」とし、その中に含まれる式が以下の対象
式をコンピュータが検索するのは計算空間的に厳しい
しかし2で得られる値が最適な式を考えるヒントになる
例 – 三角形の判定プログラムのバグ
1. 左のソースコードのもとで下中央の表のテストを実施
1 public int classify
(int a, int b, int c) {
2. T8で失敗したのでT8にAngelic Debuggingを実施
2
int retval;
3
if (a >= b && b >= c) {
• すると右下表の修正候補(代替値)が得られる
4
if (a == c || b == c) {
5
if (a == b && a == c)
3. 修正候補のうち、他のテストを阻害するものを計算
6
retval = EQUILATERAL;
7
else
• 表中の「阻害」が(正しい出力を)阻害されるテスト
8
retval = ISOSCELES;
9
} else {
4. 代替値を元に具体的なソースコードを考える
10
if (a*a != b*b + c*c) {
11
if (a*a < b*b + c*c) {
• 1つ目は「a」を「c」にすることになるので不適切
12
retval = ACUTE;
13
} else {
• 2つ目は「c」を「b」にできる→正しいコードに
14
retval = OBTUSE;
15
}
T
a
b
c
想定値
16
} else {
←表1: テストの入力値と想定値
T1
2 12 27 ILLEGAL
17
retval = RIGHT;
18
}
T2
5
4
3 RIGHT
↓表2: 修正候補と代替値など
19
}
T3
26 14 14 ISOSCELES
20
} else {
21
retval = ILLEGAL;
T4
19 19 19 EQUILATERAL
行 コード
代替値(T8) 阻害
22
}
T5
9
6
4 OBTUSE
4 if (a == c || b == c) {
7
23
return retval;
24 }
4 if (a == c || b == c) {
26
T6
24 23 21 ACUTE
4
T7
7
5
6
ILLEGAL
4
if (a == c || b == c) {
7
T3
T8
26
26
7
ISOSCELES
4
if (a == c || b == c) {
26
T3
「ACUTE」が出力↑
12
ISOSCELES
T6
retval = ACUTE;
Angelic Debuggingの評価
「Zunebug」(改)と「JTopas」に含まれるバグで実験


「Zunebug」… (参考: http://winjade.net/2009/01/lesson-on-infinite-loops/)


このバグそのものはステートメントの追加と削除という2つの修正が
必要だが、今回はツールが「ステートメントの追加」に対応していな
いため改変
「JTopas」…10のバグが含まれるVer0.4を対象とする
結果…


Zunebugでは4つの修正候補を示す


その中の1つが本当の修正候補だが、他は見てそうでないとわかる
JTopasでは(数分で)4つのバグに対し正しく修正候補を示す

残りは「1箇所修正すれば直る」ではないものか、ツールの性能的(リ
ソース的)問題で示せず
→ デバッグのスピードアップに役立つ手法の一つとして有用
5
Static Extraction of Program
Configuration Options
ICSE2011 勉強会
東京工業大学
権藤研究室 修士2年
荻原 渓太
2011/07/05
2011/7/5
6
背景と目的
設定オプション
キー値モデルの例
SERVER_ADDRESS=192.168.10.1 SERVER_PORT=80
キー値モデルで起こる問題
• 使用しないオプションがドキュメントに記述
• 使用するオプションがドキュメントに未記述
目的
キー値モデルの弱点を静的解析で補う
2011/7/5
7
貢献内容
OSSのキー値モデルの使用法を明らかに
 7つのOSSを調査(合計で百万行超)
• オプションの種類は少数
• ドキュメントとプログラムの不整合がある
2つの静的解析の提案と評価
 プログラムが使用するオプションリストを出力
 オプションの種類を推測
7つのOSSの規模とオプション数
2011/7/5
8
オプションの発見
前提
 points-to, コールグラフ
 オプション API の情報
Ariel .R, Randy. K, Static extraction of program configuration options,
In ICSE, 2011
ドキュメントのエラー
アプローチ
 オプション操作の場所の発見
 その場所でオプションを発見
評価
解析で見つからなかったオプション
 ドキュメント内容と比較
• 不一致時は手動で確認
 解析の方が正確
2011/7/5
9
オプションの分類
11種類のタイプを認識
前提
Ariel .R, Randy. K, Static extraction of program configuration options,
In ICSE, 2011
手動での分類結果(全16種類)
 points-to, コールグラフ
 前の解析結果
アプローチ
 オプション操作の返り値の型
 設定値が渡されるメソッド
解析結果
 比較される値
評価
 手動での分類と比較
 精度は82%
2011/7/5
10
An Empirical Study of Build
Maintenance Effort
S. McIntosh, B. Adams, T. H. D. Nguyen, Y. Kamei, A. E. Hassen
東京工業大学大学院 情報理工学研究科
計算工学専攻 権藤研究室
修士2年 川村恒星
2011/7/5
11
概要
ビルドはソフトウェア開発の中で重要なプロセスだが、
その手間については殆ど文書化されていない。
• 目的: 各種ソフトウェアプロジェクトを調査し、開発
者がビルド管理に費やしている労力を解析する。
• 貢献
– 製品コード変更時にビルドコード変更も行う確率を解析
– 開発メンバー間でのビルド作業分担方法を解析
• 手法:リポジトリ解析を半自動で解析
– Build Coupling
• 製品コードの変更により、ビルド管理が必要となる頻度
• リビジョンレベル、作業単位レベルでの解析
– Build Ownership
• ビルド管理作業の分担の様子
2011/7/5
12
解析結果:Build Coupling
• リビジョンレベル
– 製品コードの変更とビルド管理との間に密接な関
係無し。
– 製品コードとビルドファイルの変更は同時にコミッ
トされないから。
• 作業単位レベル
表1:ソース/テストコードを変更した作業単位のうち、ビルド管理を含むものの割合
Eclipse
Jazz
Mozilla
ソースコード
16%
4%
27%
テストコード
20%
8%
44%
– EclipseとJazzのプロジェクトはIDE(PDE)によるビル
ドコード自動生成機能が効果を発揮。
2011/7/5
13
解析結果:Build Ownership
表2:開発者の作業分担
Jazz
Git
Linux
ソース開発者のうちビルド設定を変更
79%
22%
25%
ビルド管理者のうちソース開発
87%
85%
93%
テスト開発者のうちビルド設定を変更
89%
24%
58%
ビルド管理者のうちテスト開発
44%
23%
6%
• LinuxとGitでは集中型、Jazzでは分散型
– Jazzの場合は、そもそもビルド管理の頻度が少ない。
• オープンソースの場合は集中型が適していると
推測
• テスト開発者の多くがビルド設定も行う。
2011/7/5
14
まとめ
• ソースコードの変更に対し、
– Javaのプロジェクトは4~16%
– Cのプロジェクトは27%
の確率でビルド管理を伴う。
• テストコードの変更に対し、
– Javaのプロジェクトは8~20%
– Cのプロジェクトは44%
の確率でビルド管理を伴う。
• 各種ソフトウェアプロジェクトを解析した結果、
– ビルド管理方法として集中型、分散型がある。
– テスト開発者の多くがビルド設定も行う。
– 開発者個人のビルド管理の負担は限定的。
2011/7/5
15