C语言benchmark覆盖信息收集总结4

15
Software-artifact Infrastructure RepositorySIRC 语语语语语语语语语语语语语 中中中中 中中中中中中中 中中 [email protected]2011-5-24

Transcript of C语言benchmark覆盖信息收集总结4

Page 1: C语言benchmark覆盖信息收集总结4

Software-artifact Infrastructure Repository(SIR)

C 语言程序集覆盖信息收集总结

中山大学 软件工程实验室

贺韬([email protected])2011-5-24

Page 2: C语言benchmark覆盖信息收集总结4

中山大学 软件工程实验室

C语言程序集覆盖信息收集总结

建议展开“书签”视图进行阅读。

程序集的来源

Software-artifact Infrastructure Repository(SIR)

本 文 中 使 用 的 所 有 C 语 言 的 程 序 集 , 来 自 于 Software-artifact Infrastructure

Repository(SIR):http://sir.unl.edu/。

其他程序集

1. Alitheia Core

SQO-OSS project 的 Alitheia Core 爬取了众多开源的程序集,bug 报告,以及相应的邮件列表作为基本的研究数据,同时提供的了一个 Demo:http://www.sqo-oss.org/

Demo:http://demo.sqo-oss.org/

2. PROMISE Data

International Conference on Predictive Models in Software Engineering(PROMISE)会议提供了大量用于评价预测模型(Predictive Models)的程序集(格式比较分散,包括arff,xls,SPSS,txt 等格式):http://promisedata.org/?cat=11

3. The SAMATE Reference Dataset

The National Institute of Standards and Technology (NIST) 提 供 the SAMATE Reference

Dataset 包含了一些安全漏洞:http://wrestt.cis.fiu.edu/

4. WReSTT

The Web-based Repository of Software Testing Tools (WReSTT) project 提供了各种测试工具及其教程,Links 部分提供一些有用链接。http://wrestt.cis.fiu.edu/

Links:http://wrestt.cis.fiu.edu/?q=node/37

5. Aristotle

Aristotle 小组也提供了 Siemens 程序集: http://pleuma.cc.gatech.edu/aristotle/Tools/subjects/

6. Lucia

Lucia 收集 Siemens 程序集的覆盖信息,并公布在了她的个人网站上:

版权所有 请勿翻印 内部资料 请勿外传

Page 3: C语言benchmark覆盖信息收集总结4

中山大学 软件工程实验室

http://www.mysmu.edu/phdis2009/lucia.2009/Dataset.htm

版权所有 请勿翻印 内部资料 请勿外传

Page 4: C语言benchmark覆盖信息收集总结4

中山大学 软件工程实验室

Aristotle 版与 SIR 版的 Siemens 程序集在文件组织上不同,SIR 版重新布置文件目录,把多个错误程序版本削减为单个错误,统一了所有 SIR 的程序集的目录组织,使得一份脚本可以在多个程序集上运行。本文中的脚本也是按照 SIR 的目录组织来运行的。以下页面Aristotle 版与 SIR 版的 Siemens 程序集的更多不同,包括把多个错误减少为一个错误等修改,如下页面有详细的解释:http://sir.unl.edu/content/siemens-info2.html

SIR网站简介

1. 通过以下用户名密码登录 http://sir.unl.edu/。(用户:sysu_selab;密码:selab)

2.

版权所有 请勿翻印 内部资料 请勿外传

Page 5: C语言benchmark覆盖信息收集总结4

中山大学 软件工程实验室

3. 可以看到网站分成一下模块,本文解释了一些重要的模块。

1. Download Objects

http://sir.unl.edu/php/showfiles.php

下载试验程序集:包含 C 和 Java 的 60 个程序集:15 个 C(包含了 Siemens 的 7 个程序),45 个 Java。

2. Download Tool

http://sir.unl.edu/content/tools.html

下载试验工具:包含了实验工具和脚本的下载,本文用到了其中的 mts 工具把universe 测试用例规格说明转换成对应的测试脚本。

3. C Object Handbook

http://sir.unl.edu/content/c-overall.html

推荐阅读!详细介绍了如何在 SIR 库的C 语言实验程序集上做实验,包括实验配置,测试脚本生成,错误配置。

C程序集及实验配置简介

本章介绍如何在 SIR 提供的 C 程序集上收集覆盖信息,记录了具体程序集的个别特殊配置 ,以便于以后重复进一步的实验。

程序集文件结构

程序集的文件结构分为两种,新版和旧版(Siemens 与 space)。新版介绍:http://sir.unl.edu/content/c-object-dir-spec.html

旧版介绍:http://sir.unl.edu/content/object-dir-old-spec.html

版权所有 请勿翻印 内部资料 请勿外传

Page 6: C语言benchmark覆盖信息收集总结4

中山大学 软件工程实验室

新版文件结构

下图举出 grep 程序的文件结构作为新版文件结构的例子,本文选出其中重要的部分进行介绍。

1. versions.alt:源代码a) versions.orig:该文件夹对应版本的

正确程序的源代码(版本号由子目录名注明)

b) versions.seeded:该文件夹对应版本的错误程序的源代码(版本号由子目录名注明)

2. testplans.alt:该文件夹放置测试用例(版本号由子目录名注明)

3. source:执行脚本需要把对应程序的源代码复制到此目录,使得正确程序的执行和错误程序的执行在同一个目录,因为部分程序的输出是和运行位置相关的。

4. scripts:该文件夹放置生成的测试脚本。5. inputs:该文件夹放置输入文件,因为部

分程序的输入不仅包含参数,还包含标准输入,文件输入。这些多余的输入就以文件的形式放置在该文件夹下。

6. outputs:该文件夹默认放置测试程序的输出。

7. info:包含了 SIR 的研究人员的实验结果报告。提供了测试结果,不包含覆盖信息。

版权所有 请勿翻印 内部资料 请勿外传

Page 7: C语言benchmark覆盖信息收集总结4

中山大学 软件工程实验室

旧版文件结构(Siemens 和 space 程序集)

1. versions.alt:源代码

a) versions.orig:该文件夹对应的错误程序的源代码(错误号由子目录名注明)

2. source.alt

a) source.orig::该文件夹对应的正确程序的源代码(仅一份)

3. testplans.alt:该文件夹放置测试用例4. source:执行脚本需要把对应程序的源

代码复制到此目录,使得正确程序的执行和错误程序的执行在同一个目录,因为部分程序的输出是和运行位置相关的。

5. scripts:该文件夹放置生成的测试脚本。6. inputs:该文件夹放置输入文件,因为

部分程序的输入不仅包含参数,还包含标准输入,文件输入。这些多余的输入就以文件的形式放置在该文件夹下。

7. outputs:该文件夹默认放置测试程序的输出。

8. info:包含了 SIR 的研究人员的实验结果报告。提供了测试结果,不包含覆盖信息。

新版文件结构与旧版的文件结构主要差别

1. 新版文件结构中,每个程序集分出了多个版本(v0,v1…),也有对应的正确源代码版本(v0,v1…),其中每个版本的错误程序又有若干个错误可供配置;而旧版文件结构中,每个程序集分出的若干错误程序(v0,v1…)已经包含了单个错误,对应的正确源代码只有一份。

2. 新版的测试用例是以“.universe”为后缀的文件以 mts 工具的格式保存的;而旧版的测试用例是以“universe”文件逐行保存测试程序的参数(没有按照 mts 工具的格式)。

环境以及配置

实验系统的硬件环境以及操作系统

CPU Intel(R) Core(TM) i3 CPU 530 @ 2.93GHz

Memory Total 3610080 kB/3525MiB

OS Ubuntu 10.04 LTS - the Lucid Lynx

版权所有 请勿翻印 内部资料 请勿外传

Page 8: C语言benchmark覆盖信息收集总结4

中山大学 软件工程实验室

实验需要配置的环境变量

experiment_root 实验目录 export experiment_root=~/smart_debugger/benchmark/c

javamts/mts工具简介

简介

mts 工具是用来把.universe 后缀的文件转化为测试脚本的。

输入输出举例:

下面以 grep 程序 v3 版本的 v0_1.tsl.universe 文件局部为例:-P[-n I ../inputs/grep1.dat]

-P[-n 1 ../inputs/grep1.dat]

-P[-E '\?' ../inputs/grep1.dat]

转化成相应的脚本为:(echo回显测试编号,调用 grep 测试,diff 比较输出)

用法(请参照 mts\doc\manual)

1.使用前配置 mts 的字节码路径export CLASSPATH=$CLASSPATH:/usr/lib/jvm/java/lib/antlr-2.7.6.jar:/usr/lib/jvm/java/lib/

mts.jar

2.执行 mts命令java sir.mts.MakeTestScript

--stimple-file|-sf <file>:【输入】.universe 文件路径与文件名 --script-name|-sn <name>:【输出】脚本路径与文件名

版权所有 请勿翻印 内部资料 请勿外传

Page 9: C语言benchmark覆盖信息收集总结4

中山大学 软件工程实验室

--exe-name|-en <name>:【输入】被运行程序的路径与文件名 [--experiment-dir|-ed <path>]:【输入】实验路径配置 [--compare-outputs|-c <comp_dir> [comp_cmd>]]:【输入】oracle路径,比较命令 [--compare-type|-ct D|d]

[--trace|-t]

[--trace-source-dir|-ts <path>]

[--trace-name|-tn <name>]

[--invoke-prefix|-ip <prefix>]

[--invoke-suffix|-is <suffix>]

[--exe-prefix|-ep <prefix>]

[--exe-suffix|-es <suffix> [D]]

[--java|-j]

[--target|-tg <script_gen_class>]:【输出】脚本的类型:bash,csh

[--no-escapes|-nesc]:【输入】输入脚本是否转义 [--legacy-macros|-lm]

[--print-config|-pc]

[--version]

用例

#set up MTS' CLASSPATH (Java)

export CLASSPATH=$CLASSPATH:/usr/lib/jvm/java/lib/antlr-2.7.6.jar:/usr/lib/jvm/java/lib/

mts.jar

#generate test scripts

echo "$(date) generate test scripts: fault-$fault"

java sir.mts.MakeTestScript\

-sf $universe\

-sn $benchmark_dir/scripts/$fault.sh\

-en $benchmark_dir/source/$program.exe\

-ed $benchmark_dir/\

-c $benchmark_dir/archives/ORACLE/outputs diff\

-tg bsh -nesc

gcc简介

编译器:本文中仅使用其 C 语言的编译功能。

用法

gcc [-c|-S|-E] [-std=standard]

[-g] [-pg] [-Olevel]

[-Wwarn...] [-pedantic]

版权所有 请勿翻印 内部资料 请勿外传

Page 10: C语言benchmark覆盖信息收集总结4

中山大学 软件工程实验室

[-Idir...] [-Ldir...]

[-Dmacro[=defn]...] [-Umacro]

[-foption...] [-mmachine-option...]

[-o outfile] [@file] infile...

比较重要的参数有:-I include头文件目录-o 输出可执行程序名字lxxx 链接的外部库名字-L 链接的外部库的目录-fprofile-arcs 生成弧信息(收集覆盖信息的参数)-ftest-coverage 生成覆盖信息(收集覆盖信息的参数)-D 定义宏

用例

gcc -D$fault -DHAVE_SYS_SIGLIST -fprofile-arcs -ftest-coverage -I. -o $fault.exe $program.c

libglob.a -L/usr/local/lib

gcov

本文中使用 gcov 用来收集程序的覆盖信息。(gcov 收集多个文件的覆盖信息总存在部分文件不可被覆盖的错误情况,致使收集的覆盖信息无效,正确方法还在探索中。)

用法

gcov [-v|--version] [-h|--help]

[-a|--all-blocks]

[-b|--branch-probabilities]

[-c|--branch-counts]

[-n|--no-output]

[-l|--long-file-names]

[-p|--preserve-paths]

[-f|--function-summaries]

[-o|--object-directory directory|file] sourcefiles

[-u|--unconditional-branches]

调用步骤

命令:编译->执行->收集覆盖 输入 输出gcc -fprofile-arcs -ftest-coverage

–o program.exe program.c

program.c program.gcno

./program.exe < testcase program.exe; testcase program. gcda

版权所有 请勿翻印 内部资料 请勿外传

Page 11: C语言benchmark覆盖信息收集总结4

中山大学 软件工程实验室

gcov program.c program.c; program.gcno; program.gcda program.gcov

如何生成多文件的覆盖信息?

gcov *.c 可以使用通配符生成多个.c 文件的覆盖信息

Shell

Shell 脚本的优点主要体现在:1. 可以无缝的执行 shell命令2. grep,awk,sed 在字符串处理上编码编码量减少3. 管道+shell控制流+shell变量,让基于文件的操作编码量减少Shell 的缺点:1. 代码的可读性比较弱2. 缺少相关的编辑器和调试器3. 缺少内置的数据结构,仅有简单的数组4. 控制流语句比较原始

Python

Python 是一种生产率较高的脚本语言,本文使用 Python 语言把覆盖信息转化为 arff 文件。相对于 Shell,Python 的优点:1. 内置的数据结构通用而便捷2. 完善的控制流语句

收集覆盖信息流程

收集覆盖信息的流程大致分为以下 7 步:1. 选择实验的程序(考虑可以植入的错误个数)2. 编译程序(使用 gcc)3. 选择实验的测试集的规格说明(考虑对应程序失败的用例数目)4. 生成测试脚本(使用 mts)5. 转化测试脚本(mts 生成脚本并不包含收集覆盖信息的部分,本文实现一个插入收集

覆盖信息语句到测试脚本的小程序)6. 构造测试脚本运行的文件结构(生成的 output,gcov,arff 文件应放置在哪个文件夹)7. 执行测试脚本8. 收集并转化覆盖信息(使用本文编写的 Python 小程序)

版权所有 请勿翻印 内部资料 请勿外传

Page 12: C语言benchmark覆盖信息收集总结4

中山大学 软件工程实验室

覆盖信息收集的程序集分类

程序集的分类

程序集分类 包含的程序集旧版程序集 Siemens

(print_tokens, print_tokens2, replace, schedule, schedule2, tcas, tot_info)

space

新版程序集 grep, gzip, sed, space, flex

多文件的程序集 vim, bash; make

程序集分类的区别

附一份旧版 universe 文件局部(Siemens 的 replace 程序的 universe 文件):'-?' 'a&' < temp-test/1.inp.1.1

' ' '@%@&' < temp-test/777.inp.334.1

' ' 'NEW' < temp-test/550.inp.238.1

' ' 'NEW' < temp-test/551.inp.238.3

可以看见旧版的 universe 文件仅含程序运行参数和重定向的输入文件。

附 grep 程序 v3 版本的 v0_1.tsl.universe 文件局部:-P[-n I ../inputs/grep1.dat]

-P[-n 1 ../inputs/grep1.dat]

-P[-E '\?' ../inputs/grep1.dat]

可以看见新版的.universe 可以配置的选项更多了。

覆盖信息的收集

不同分类的程序集其收集覆盖信息的步骤略有不同,总体上来说大致有六步:编译——生成测试脚本——修改测试脚本——执行测试脚本——收集覆盖信息——转化为 arff。

版权所有 请勿翻印 内部资料 请勿外传

程序集分类 程序集分类间的区别旧版程序集 每一个版本(v1,v2,v3)对应一个错误

测试用例规格 universe 为程序参数(本文使用 awk 转化成 mts 格式)新版程序集 每一个版本(v1,v2,v3)对应多个错误,使用宏植入错误

测试用例规格为 mts 格式多文件的程序集 每一个版本(v1,v2,v3)对应多个错误,使用宏植入错误

测试用例规格为 SIR 的研究员编写好的脚本

Page 13: C语言benchmark覆盖信息收集总结4

中山大学 软件工程实验室

具体的不同请参照下表:

程序集注解

程序集的功能介绍(其余信息可参考 http://sir.unl.edu/php/showfiles.php)

程序集名称 功能简介print_tokens 词法分析print_tokens2 词法分析replace 模式匹配替换schedule 优先级调度schedule2 优先级调度tcas 高度划分tot_info 度量统计多个表的数据bash 操作系统的命令行交互界面flex 快速的词法分析器

版权所有 请勿翻印 内部资料 请勿外传

程序集分类 覆盖信息的收集步骤旧版程序集 1. gcc编译:加上-fprofile-arcs -ftest-coverage 选项

2. sed 转化 universe 测试脚本为 mts 格式:selab.universe

3. mts根据 selab.universe 生成测试脚本 program.sh

4. sed 替 换 测 试 脚 本 program.sh 中 的 语 句 , 生 成 新 脚 本program.gcov.sh , 使 其 能 对 每 次 执 行 生 成 的program.gcno、program. gcda、program.gcov 文件进行相应的归档。

5. 执行测试脚本 program.gcov.sh

6. 使用 Python 脚本 to_arff.py 把收集的覆盖信息转化为 arff 文件新版程序集 1. gcc编译:加上-fprofile-arcs -ftest-coverage 选项

2. mts根据 xx.universe 生成测试脚本 program.sh

3. sed 替 换 测 试 脚 本 program.sh 中 的 语 句 , 生 成 新 脚 本program.gcov.sh , 使 其 能 对 每 次 执 行 生 成 的program.gcno、program. gcda、program.gcov 文件进行相应的归档。

4. 执行测试脚本 program.gcov.sh

5. 使用 Python 脚本 to_arff.py 把收集的覆盖信息转化为 arff 文件多文件的程序集 1. 修改 SIR 研究员编写的 Perl 脚本:1.为 gcc加上 -fprofile-arcs -

ftest-coverage 选项;2.对每次执行生成的 program.gcno、program.

gcda、program.gcov 文件进行相应的归档。2. 进入 scripts 目录3. ./clean4. ./ makevers $FAULT5. ./ runall

Page 14: C语言benchmark覆盖信息收集总结4

中山大学 软件工程实验室

grep 抓取模式匹配的一行gzip 压缩make 管理可执行程序或者其他项目的生成sed 流编辑器(行内匹配替换)space 基于规格生成数组vim 编辑器

程序集版本与测试用例的选择

下表列出了程序集的名称,选用的程序版本,对应的错误个数,选用的测试用例。本文的选择主要参考了 Wong 的选择[1],对于其中没有选用的程序集,本文优先考虑失败测试用例较多的程序版本。(通过查看 info 目录下 SIR 研究人员给出的报告可知失败测试用例个数。)Siemens程序集并没有列出,因为它没有可供选择的程序版本和测试集。

程序集(名称 /

规模)选用版本(程序版本/SIR 版本)

对应错误个数 测试用例(个数 /规格文件)

grep

10068 LOC

146 procedures

2.2

v3

18 470

v0_1.tsl.universe

gzip

5680 LOC

104 procedures

1.1.2

v1

16 217

v0.tsl.universe.orig

make

35545 LOC

268 procedures

3.76.1

v1

19 793

v0_1.tsl.universe

space

6199 LOC

136 procedures

38 13585

universe

flex

10459 LOC

162 procedures

2.5.1

v2

(v1 [2], v5 [3])

20 525

v0.tsl.universe

sed

14427 LOC

255 procedures

3.01

v3

6 360

v0_2.universe

bash

59846 LOC

1061 procedures

2.05

v3

6 1061

testplans.fine

.test 结尾皆为测例vim

122169 LOC

1999 procedures

5.6

v5

4

grep ‘FAULTY_F*’ *.c

975

版权所有 请勿翻印 内部资料 请勿外传

Page 15: C语言benchmark覆盖信息收集总结4

中山大学 软件工程实验室

相关问题

1. 问:如何抓取多个源代码程序的覆盖信息?答:在每个步骤,执行命令使用通配符匹配对对应文件即可。(gcov 收集多个文件的覆盖信息总存在部分文件不可被覆盖的错误情况,致使收集的覆盖信息无效,正确方法还在探索中。)

2. 问:每个程序运行位置应该在哪?答:SIR 的目录结构有 source 文件夹,所有版本的程序都应该复制到该目录下再执行 ,这是因为部分程序的输出是程序的位置相关的,例如 gzip 程序。如果位置不对,使其在对照 oracle 程序的输出时就会产生误判,得到错误的测试结果。

参考文献

[1]. Eric Wong, W., V. Debroy and B. Choi, A family of code coverage-based heuristics for

effective fault localization. Journal of Systems and Software, 2010. 83(2): p. 188-208.

[2]. Liu, C., Statistical Debugging and Automated Program Failure Triage. 2008: VDM Verlag.

156.

[3]. Zhang, X., et al., Experimental evaluation of using dynamic slices for fault location, in

Proceedings of the 6th International Symposium on Automated and Analysis-Driven Debugging,

AADEBUG 2005. 2005: Monterey, CA, United states. p. 33-42.

版权所有 请勿翻印 内部资料 请勿外传