Software-artifact Infrastructure Repository(SIR) C 语言程序集覆盖信息收集总结 中山大学 软件工程实验室贺韬(elfinhe@gmail.com)2011-5-24
中山大学 软件工程实验室C 语言程序集覆盖信息收集总结建议展开“书签”视图进行阅读。程序集的来源Software-artifact Infrastructure Repository(SIR)本文中使用的所有 C 语言的程序集,   来自于 S...
中山大学 软件工程实验室注Aristotle 版与 SIR 版的 Siemens 程序集在文件组织上不同,SIR 版重新布置文件目录,把多个错误程序版本削减为单个错误,统一了所有 SIR 的程序集的目录组织,使得一份脚本可以在多个程序集上运行。...
中山大学 软件工程实验室2.   可以看到网站分成一下模块,本文解释了一些重要的模块。                       1. Download Objects                          http://sir....
中山大学 软件工程实验室新版文件结构下图举出 grep 程序的文件结构作为新版文件结构的例子,本文选出其中重要的部分进行介绍。                       1. versions.alt:源代码                 ...
中山大学 软件工程实验室旧版文件结构(Siemens 和 space 程序集)                               1.   versions.alt:源代码                               ...
中山大学 软件工程实验室实验需要配置的环境变量experiment_root    实验目录             export experiment_root=~/smart_debugger/benchmark/cjavamts/mts ...
中山大学 软件工程实验室                            【输出】脚本路径与文件名    --script-name|-sn <name>:    --exe-name|-en <name>:【输入】被运行程序的路径与文件...
中山大学 软件工程实验室用法   gcc [-c|-S|-E] [-std=standard]        [-g] [-pg] [-Olevel]        [-Wwarn...] [-pedantic]        [-Idir.....
中山大学 软件工程实验室              [-u|--unconditional-branches]调用步骤命令:编译->执行->收集覆盖                      输入                        ...
中山大学 软件工程实验室6.   构造测试脚本运行的文件结构(生成的 output,gcov,arff 文件应放置在哪个文件夹)7.   执行测试脚本8.   收集并转化覆盖信息(使用本文编写的 Python 小程序)覆盖信息收集的程序集分类程...
中山大学 软件工程实验室…可以看见旧版的 universe 文件仅含程序运行参数和重定向的输入文件。附 grep 程序 v3 版本的 v0_1.tsl.universe 文件局部:-P[-n I ../inputs/grep1.dat]-P[-...
中山大学 软件工程实验室程序集分类     覆盖信息的收集步骤旧版程序集     1.   gcc 编译:加上-fprofile-arcs -ftest-coverage 选项          2.   sed 转化 universe 测试脚...
中山大学 软件工程实验室程序集注解程序集的功能介绍(其余信息可参考 http://sir.unl.edu/php/showfiles.php)程序集名称                            功能简介print_tokens  ...
中山大学 软件工程实验室择主要参考了 Wong 的选择[1],对于其中没有选用的程序集,本文优先考虑失败测试用例较多的程序版本。      (通过查看 info 目录下 SIR 研究人员给出的报告可知失败测试用例个数。)Siemens 程序集并...
中山大学 软件工程实验室     在探索中。         )2.   问:每个程序运行位置应该在哪?     答:SIR 的目录结构有 source 文件夹,所有版本的程序都应该复制到该目录下再执行,     这是因为部分程序的输出是程序的...
Upcoming SlideShare
Loading in …5
×

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

1,914 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,914
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
25
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. Software-artifact Infrastructure Repository(SIR) C 语言程序集覆盖信息收集总结 中山大学 软件工程实验室贺韬(elfinhe@gmail.com)2011-5-24
  2. 2. 中山大学 软件工程实验室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=113. 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/375. 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. 3. 中山大学 软件工程实验室注Aristotle 版与 SIR 版的 Siemens 程序集在文件组织上不同,SIR 版重新布置文件目录,把多个错误程序版本削减为单个错误,统一了所有 SIR 的程序集的目录组织,使得一份脚本可以在多个程序集上运行。 本文中的脚本也是按照 SIR 的目录组织来运行的。 以下页面 Aristotle版与 SIR 版的 Siemens 程序集的更多不同, 包括把多个错误减少为一个错误等修改, 如下页面有详细的解释:http://sir.unl.edu/content/siemens-info2.htmlSIR 网站简介1. 通过以下用户名密码登录 http://sir.unl.edu/。(用户:sysu_selab;密码:selab) 版权所有 请勿翻印 内部资料 请勿外传
  4. 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. 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. 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.93GHzMemory Total 3610080 kB/3525MiBOS Ubuntu 10.04 LTS - the Lucid Lynx 版权所有 请勿翻印 内部资料 请勿外传
  7. 7. 中山大学 软件工程实验室实验需要配置的环境变量experiment_root 实验目录 export experiment_root=~/smart_debugger/benchmark/cjavamts/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 的字节码路径exportCLASSPATH=$CLASSPATH:/usr/lib/jvm/java/lib/antlr-2.7.6.jar:/usr/lib/jvm/java/lib/mts.jar2.执行 mts 命令java sir.mts.MakeTestScript --stimple-file|-sf <file>:【输入】.universe 文件路径与文件名 版权所有 请勿翻印 内部资料 请勿外传
  8. 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)exportCLASSPATH=$CLASSPATH:/usr/lib/jvm/java/lib/antlr-2.7.6.jar:/usr/lib/jvm/java/lib/mts.jar#generate test scriptsecho "$(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 -nescgcc 简介编译器:本文中仅使用其 C 语言的编译功能。 版权所有 请勿翻印 内部资料 请勿外传
  9. 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.clibglob.a -L/usr/local/libgcov本文中使用 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. 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. gcdagcov program.c program.c; program.gcno; program.gcda program.gcov如何生成多文件的覆盖信息?gcov *.c 可以使用通配符生成多个.c 文件的覆盖信息ShellShell 脚本的优点主要体现在:1. 可以无缝的执行 shell 命令2. grep,awk,sed 在字符串处理上编码编码量减少3. 管道+shell 控制流+shell 变量,让基于文件的操作编码量减少Shell 的缺点:1. 代码的可读性比较弱2. 缺少相关的编辑器和调试器3. 缺少内置的数据结构,仅有简单的数组4. 控制流语句比较原始PythonPython 是一种生产率较高的脚本语言,本文使用 Python 语言把覆盖信息转化为 arff 文件。相对于 Shell,Python 的优点:1. 内置的数据结构通用而便捷2. 完善的控制流语句收集覆盖信息流程收集覆盖信息的流程大致分为以下 7 步:1. 选择实验的程序(考虑可以植入的错误个数)2. 编译程序(使用 gcc)3. 选择实验的测试集的规格说明(考虑对应程序失败的用例数目)4. 生成测试脚本(使用 mts)5. 转化测试脚本(mts 生成脚本并不包含收集覆盖信息的部分,本文实现一个插入收集覆 盖信息语句到测试脚本的小程序) 版权所有 请勿翻印 内部资料 请勿外传
  11. 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. 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. 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 版权所有 请勿翻印 内部资料 请勿外传
  14. 14. 中山大学 软件工程实验室程序集注解程序集的功能介绍(其余信息可参考 http://sir.unl.edu/php/showfiles.php)程序集名称 功能简介print_tokens 词法分析print_tokens2 词法分析replace 模式匹配替换schedule 优先级调度schedule2 优先级调度tcas 高度划分tot_info 度量统计多个表的数据bash 操作系统的命令行交互界面flex 快速的词法分析器grep 抓取模式匹配的一行gzip 压缩make 管理可执行程序或者其他项目的生成sed 流编辑器(行内匹配替换)space 基于规格生成数组vim 编辑器程序集版本与测试用例的选择下表列出了程序集的名称,选用的程序版本,对应的错误个数,选用的测试用例。本文的选 版权所有 请勿翻印 内部资料 请勿外传
  15. 15. 中山大学 软件工程实验室择主要参考了 Wong 的选择[1],对于其中没有选用的程序集,本文优先考虑失败测试用例较多的程序版本。 (通过查看 info 目录下 SIR 研究人员给出的报告可知失败测试用例个数。)Siemens 程序集并没有列出,因为它没有可供选择的程序版本和测试集。程序集(名称/ 选用版本(程序版本 对应错误个数 测试用例(个数/规格规模) /SIR 版本) 文件)grep 2.2 18 47010068 LOC v3 v0_1.tsl.universe146 proceduresgzip 1.1.2 16 2175680 LOC v1 v0.tsl.universe.orig104 proceduresmake 3.76.1 19 79335545 LOC v1 v0_1.tsl.universe268 proceduresspace 38 135856199 LOC universe136 proceduresflex 2.5.1 20 52510459 LOC v2 v0.tsl.universe162 procedures (v1 [2], v5 [3])sed 3.01 6 36014427 LOC v3 v0_2.universe255 proceduresbash 2.05 6 106159846 LOC v3 testplans.fine1061 procedures .test 结尾皆为测例vim 5.6 4 975122169 LOC v5 grep ‘FAULTY_F*’ *.c1999 procedures相关问题1. 问:如何抓取多个源代码程序的覆盖信息? 答:在每个步骤,执行命令使用通配符匹配对对应文件即可。 (gcov 收集多个文件的覆 盖信息总存在部分文件不可被覆盖的错误情况,致使收集的覆盖信息无效,正确方法还 版权所有 请勿翻印 内部资料 请勿外传
  16. 16. 中山大学 软件工程实验室 在探索中。 )2. 问:每个程序运行位置应该在哪? 答:SIR 的目录结构有 source 文件夹,所有版本的程序都应该复制到该目录下再执行, 这是因为部分程序的输出是程序的位置相关的,例如 gzip 程序。如果位置不对,使其 在对照 oracle 程序的输出时就会产生误判,得到错误的测试结果。参考文献[1]. Eric Wong, W., V. Debroy and B. Choi, A family of code coverage-based heuristics foreffective 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, inProceedings of the 6th International Symposium on Automated and Analysis-Driven Debugging,AADEBUG 2005. 2005: Monterey, CA, United states. p. 33-42. 版权所有 请勿翻印 内部资料 请勿外传

×