ICT,让城市更智慧 - egag.org.cn · 城市通信网:有线+无线,敏捷网络,构建城市无处不在的宽带 ... 联接更多物 更广的覆盖 超低功耗 NB-IoT
C语言benchmark覆盖信息收集总结4
Transcript of C语言benchmark覆盖信息收集总结4
Software-artifact Infrastructure Repository(SIR)
C 语言程序集覆盖信息收集总结
中山大学 软件工程实验室
贺韬([email protected])2011-5-24
中山大学 软件工程实验室
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
版权所有 请勿翻印 内部资料 请勿外传
中山大学 软件工程实验室
注
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.
版权所有 请勿翻印 内部资料 请勿外传
中山大学 软件工程实验室
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
版权所有 请勿翻印 内部资料 请勿外传
中山大学 软件工程实验室
新版文件结构
下图举出 grep 程序的文件结构作为新版文件结构的例子,本文选出其中重要的部分进行介绍。
1. versions.alt:源代码a) versions.orig:该文件夹对应版本的
正确程序的源代码(版本号由子目录名注明)
b) versions.seeded:该文件夹对应版本的错误程序的源代码(版本号由子目录名注明)
2. testplans.alt:该文件夹放置测试用例(版本号由子目录名注明)
3. source:执行脚本需要把对应程序的源代码复制到此目录,使得正确程序的执行和错误程序的执行在同一个目录,因为部分程序的输出是和运行位置相关的。
4. scripts:该文件夹放置生成的测试脚本。5. inputs:该文件夹放置输入文件,因为部
分程序的输入不仅包含参数,还包含标准输入,文件输入。这些多余的输入就以文件的形式放置在该文件夹下。
6. outputs:该文件夹默认放置测试程序的输出。
7. info:包含了 SIR 的研究人员的实验结果报告。提供了测试结果,不包含覆盖信息。
版权所有 请勿翻印 内部资料 请勿外传
中山大学 软件工程实验室
旧版文件结构(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
版权所有 请勿翻印 内部资料 请勿外传
中山大学 软件工程实验室
实验需要配置的环境变量
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>:【输出】脚本路径与文件名
版权所有 请勿翻印 内部资料 请勿外传
中山大学 软件工程实验室
--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]
版权所有 请勿翻印 内部资料 请勿外传
中山大学 软件工程实验室
[-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
版权所有 请勿翻印 内部资料 请勿外传
中山大学 软件工程实验室
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 小程序)
版权所有 请勿翻印 内部资料 请勿外传
中山大学 软件工程实验室
覆盖信息收集的程序集分类
程序集的分类
程序集分类 包含的程序集旧版程序集 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 的研究员编写好的脚本
中山大学 软件工程实验室
具体的不同请参照下表:
程序集注解
程序集的功能介绍(其余信息可参考 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
中山大学 软件工程实验室
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
版权所有 请勿翻印 内部资料 请勿外传
中山大学 软件工程实验室
相关问题
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.
版权所有 请勿翻印 内部资料 请勿外传