7. 問題と解決:柔軟な測定
• 例)ライブラリ呼び出し • 機能拡張による実現
のみを測定対象 – 測定対象の限定
• 例)特定変数を測定対象
全ステートメン libfuncのみを対象
変数bのみを対象
トが測定対象
int main() { int main() {
int a = 0, b = 1; int a = 0, b = 1;
a = libfunc(a); a = libfunc(a);
b = func1(a + b); b = func1(a + b);
a = libfunc(b); a = libfunc(b);
b = func2(a - b); b = func2(a – b);
} }
2012/11/2 ガイオ プライベートセミナー 2012秋 7
8. 問題と解決:完全な測定
実装が困難
• 従来の測定方法
測定もれ問題
– 測定可能な実行処理系の実装
– バイナリコードに測定用コードの埋め込み
public class DeadCode {
public static void main(String[] args) {
System.out.println("main"); 測定不可能
if (false)
System.out.println("dead code");
}
•実装が簡単
} •測定もれなし
• 提案手法
– ソースコードに測定用コードの埋め込み
2012/11/2 ガイオ プライベートセミナー 2012秋 8
9. • 自動的に挿入
• カバレッジ情報の出力
OCCFの測定アプローチ • 副作用なし
• 測定もれなし
命令網羅と
int func(int a) { 分岐網羅を測定
if (a == 0) { int func(int a) {
printf("a == 0"); if (branch(0, a == 0)) {
} stmt(0);
else if (false) { printf("a == 0");
printf("a != 0"); }
} AST上で埋め込み else if (branch(1,false)){
} stmt(1);
Function printf("a != 0");
int func(int a) }
}
Statement Statement
void stmt(int id) {
Statement
Statement RECORD_STATEMENT(id);
printf("a == 0") printf("a != 0")
stmt (0) }
抽象構文木(AST) stmt (1)
2012/11/2 ガイオ プライベートセミナー 2012秋 9
28. 代表的なツール
• Tarantula(現在は非公開?)*
• OCCFも複数言語に対応したRisk算出が可能
*) Jones, J.A.; Harrold, M.J.; Stasko, J.; , "Visualization of test information to assist fault localization," Proceedings of the 24rd
International Conference on Software Engineering (ICSE 2002), pp.467-477, 25-25 May 2002.
2012/11/2 ガイオ プライベートセミナー 2012秋 28