More Related Content Similar to C语言benchmark覆盖信息收集总结4 Similar to C语言benchmark覆盖信息收集总结4 (20) C语言benchmark覆盖信息收集总结42. 中山大学 软件工程实验室
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 程序集的覆盖信息,并公布在了她的个人网站上:
http://www.mysmu.edu/phdis2009/lucia.2009/Dataset.htm
版权所有 请勿翻印 内部资料 请勿外传
3. 中山大学 软件工程实验室
注
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)
版权所有 请勿翻印 内部资料 请勿外传
4. 中山大学 软件工程实验室
2. 可以看到网站分成一下模块,本文解释了一些重要的模块。
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
版权所有 请勿翻印 内部资料 请勿外传
5. 中山大学 软件工程实验室
新版文件结构
下图举出 grep 程序的文件结构作为新版文件结构的例子,本文选出其中重要的部分进行介
绍。
1. versions.alt:源代码
a) versions.orig:该文件夹对应版本的正
确程序的源代码 (版本号由子目录名
注明)
b) versions.seeded:该文件夹对应版本
的错误程序的源代码 (版本号由子目
录名注明)
2. testplans.alt:该文件夹放置测试用例(版
本号由子目录名注明)
3. source:执行脚本需要把对应程序的源代
码复制到此目录, 使得正确程序的执行和
错误程序的执行在同一个目录, 因为部分
程序的输出是和运行位置相关的。
4. scripts:该文件夹放置生成的测试脚本。
5. inputs:该文件夹放置输入文件,因为部
分程序的输入不仅包含参数, 还包含标准
输入,文件输入。这些多余的输入就以文
件的形式放置在该文件夹下。
6. outputs:该文件夹默认放置测试程序的输
出。
7. info:包含了 SIR 的研究人员的实验结果
报告。 提供了测试结果, 不包含覆盖信息。
版权所有 请勿翻印 内部资料 请勿外传
6. 中山大学 软件工程实验室
旧版文件结构(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
版权所有 请勿翻印 内部资料 请勿外传
7. 中山大学 软件工程实验室
实验需要配置的环境变量
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 比较输出)
用法(请参照 mtsdocmanual)
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 文件路径与文件名
版权所有 请勿翻印 内部资料 请勿外传
8. 中山大学 软件工程实验室
【输出】脚本路径与文件名
--script-name|-sn <name>:
--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]
【输出】脚本的类型:bash,csh
[--target|-tg <script_gen_class>]:
[--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 语言的编译功能。
版权所有 请勿翻印 内部资料 请勿外传
9. 中山大学 软件工程实验室
用法
gcc [-c|-S|-E] [-std=standard]
[-g] [-pg] [-Olevel]
[-Wwarn...] [-pedantic]
[-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
版权所有 请勿翻印 内部资料 请勿外传
10. 中山大学 软件工程实验室
[-u|--unconditional-branches]
调用步骤
命令:编译->执行->收集覆盖 输入 输出
gcc -fprofile-arcs -ftest-coverage program.c program.gcno
–o program.exe program.c
./program.exe < testcase program.exe; testcase program. gcda
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 生成脚本并不包含收集覆盖信息的部分,本文实现一个插入收集覆
盖信息语句到测试脚本的小程序)
版权所有 请勿翻印 内部资料 请勿外传
11. 中山大学 软件工程实验室
6. 构造测试脚本运行的文件结构(生成的 output,gcov,arff 文件应放置在哪个文件夹)
7. 执行测试脚本
8. 收集并转化覆盖信息(使用本文编写的 Python 小程序)
覆盖信息收集的程序集分类
程序集的分类
程序集分类 包含的程序集
Siemens
旧版程序集
(print_tokens, print_tokens2, replace, schedule, schedule2, tcas, tot_info)
space
grep, gzip, sed, space, flex
新版程序集
vim, bash; make
多文件的程序集
程序集分类的区别
程序集分类 程序集分类间的区别
旧版程序集 每一个版本(v1,v2,v3)对应一个错误
测试用例规格 universe 为程序参数(本文使用 awk 转化成 mts 格式)
新版程序集 每一个版本(v1,v2,v3)对应多个错误,使用宏植入错误
测试用例规格为 mts 格式
多文件的程序集 每一个版本(v1,v2,v3)对应多个错误,使用宏植入错误
测试用例规格为 SIR 的研究员编写好的脚本
附一份旧版 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
版权所有 请勿翻印 内部资料 请勿外传
12. 中山大学 软件工程实验室
…
可以看见旧版的 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。
具体的不同请参照下表:
版权所有 请勿翻印 内部资料 请勿外传
13. 中山大学 软件工程实验室
程序集分类 覆盖信息的收集步骤
旧版程序集 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. ./clean
4. ./ makevers $FAULT
5. ./ runall
版权所有 请勿翻印 内部资料 请勿外传
15. 中山大学 软件工程实验室
择主要参考了 Wong 的选择[1],对于其中没有选用的程序集,本文优先考虑失败测试用例较
多的程序版本。
(通过查看 info 目录下 SIR 研究人员给出的报告可知失败测试用例个数。)
Siemens 程序集并没有列出,因为它没有可供选择的程序版本和测试集。
程序集(名称/ 选用版本(程序版本 对应错误个数 测试用例(个数/规格
规模) /SIR 版本) 文件)
grep 2.2 18 470
10068 LOC v3 v0_1.tsl.universe
146 procedures
gzip 1.1.2 16 217
5680 LOC v1 v0.tsl.universe.orig
104 procedures
make 3.76.1 19 793
35545 LOC v1 v0_1.tsl.universe
268 procedures
space 38 13585
6199 LOC universe
136 procedures
flex 2.5.1 20 525
10459 LOC v2 v0.tsl.universe
162 procedures (v1 [2], v5 [3])
sed 3.01 6 360
14427 LOC v3 v0_2.universe
255 procedures
bash 2.05 6 1061
59846 LOC v3 testplans.fine
1061 procedures
.test 结尾皆为测例
vim 5.6 4 975
122169 LOC v5 grep ‘FAULTY_F*’ *.c
1999 procedures
相关问题
1. 问:如何抓取多个源代码程序的覆盖信息?
答:在每个步骤,执行命令使用通配符匹配对对应文件即可。
(gcov 收集多个文件的覆
盖信息总存在部分文件不可被覆盖的错误情况,致使收集的覆盖信息无效,正确方法还
版权所有 请勿翻印 内部资料 请勿外传
16. 中山大学 软件工程实验室
在探索中。
)
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.
版权所有 请勿翻印 内部资料 请勿外传