SlideShare une entreprise Scribd logo
1  sur  16
Software-artifact Infrastructure Repository(SIR)


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

 中山大学 软件工程实验室




贺韬(elfinhe@gmail.com)
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.   可以看到网站分成一下模块,本文解释了一些重要的模块。
                       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 比较输出)




用法(请参照 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 文件路径与文件名



                           版权所有 请勿翻印            内部资料 请勿外传
中山大学 软件工程实验室



                            【输出】脚本路径与文件名
    --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 语言的编译功能。

                             版权所有 请勿翻印          内部资料 请勿外传
中山大学 软件工程实验室


用法


   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   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 生成脚本并不包含收集覆盖信息的部分,本文实现一个插入收集覆
   盖信息语句到测试脚本的小程序)

                            版权所有 请勿翻印              内部资料 请勿外传
中山大学 软件工程实验室


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


                            版权所有 请勿翻印              内部资料 请勿外传
中山大学 软件工程实验室


…

可以看见旧版的 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。

具体的不同请参照下表:




                                  版权所有 请勿翻印   内部资料 请勿外传
中山大学 软件工程实验室


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


旧版程序集     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



               版权所有 请勿翻印            内部资料 请勿外传
中山大学 软件工程实验室



程序集注解



程序集的功能介绍(其余信息可参考 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
                                 编辑器


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



下表列出了程序集的名称,选用的程序版本,对应的错误个数,选用的测试用例。本文的选



                   版权所有 请勿翻印      内部资料 请勿外传
中山大学 软件工程实验室



择主要参考了 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 收集多个文件的覆

     盖信息总存在部分文件不可被覆盖的错误情况,致使收集的覆盖信息无效,正确方法还

                           版权所有 请勿翻印         内部资料 请勿外传
中山大学 软件工程实验室



     在探索中。
         )

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.




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

Contenu connexe

Tendances

Developing with SharePoint Framework (SPFx) on-premises
Developing with SharePoint Framework (SPFx) on-premisesDeveloping with SharePoint Framework (SPFx) on-premises
Developing with SharePoint Framework (SPFx) on-premisesDragan Panjkov
 
Service Oriented Architectures and Web Services
Service Oriented Architectures and Web ServicesService Oriented Architectures and Web Services
Service Oriented Architectures and Web ServicesCesare Pautasso
 
Intro to Office 365 Security & Compliance Center
Intro to Office 365 Security & Compliance CenterIntro to Office 365 Security & Compliance Center
Intro to Office 365 Security & Compliance CenterCraig Jahnke
 
SFBA Usergroup meeting November 2, 2022
SFBA Usergroup meeting November 2, 2022SFBA Usergroup meeting November 2, 2022
SFBA Usergroup meeting November 2, 2022Becky Burwell
 
Configuration Management and Provisioning Are Different
Configuration Management and Provisioning Are DifferentConfiguration Management and Provisioning Are Different
Configuration Management and Provisioning Are DifferentCarlos Nunez
 
The Azure Group - Azure Network Watcher
The Azure Group - Azure Network WatcherThe Azure Group - Azure Network Watcher
The Azure Group - Azure Network WatcherAdin Ermie
 
Web Server And Database Server
Web Server And Database ServerWeb Server And Database Server
Web Server And Database ServerMahbubur Rahman
 

Tendances (9)

Developing with SharePoint Framework (SPFx) on-premises
Developing with SharePoint Framework (SPFx) on-premisesDeveloping with SharePoint Framework (SPFx) on-premises
Developing with SharePoint Framework (SPFx) on-premises
 
Service Oriented Architectures and Web Services
Service Oriented Architectures and Web ServicesService Oriented Architectures and Web Services
Service Oriented Architectures and Web Services
 
Intro to Office 365 Security & Compliance Center
Intro to Office 365 Security & Compliance CenterIntro to Office 365 Security & Compliance Center
Intro to Office 365 Security & Compliance Center
 
Syslog
SyslogSyslog
Syslog
 
SFBA Usergroup meeting November 2, 2022
SFBA Usergroup meeting November 2, 2022SFBA Usergroup meeting November 2, 2022
SFBA Usergroup meeting November 2, 2022
 
Configuration Management and Provisioning Are Different
Configuration Management and Provisioning Are DifferentConfiguration Management and Provisioning Are Different
Configuration Management and Provisioning Are Different
 
The Azure Group - Azure Network Watcher
The Azure Group - Azure Network WatcherThe Azure Group - Azure Network Watcher
The Azure Group - Azure Network Watcher
 
Virtualization
VirtualizationVirtualization
Virtualization
 
Web Server And Database Server
Web Server And Database ServerWeb Server And Database Server
Web Server And Database Server
 

En vedette

Introduction to llvm
Introduction to llvmIntroduction to llvm
Introduction to llvmTao He
 
Java覆盖信息收集工具比较
Java覆盖信息收集工具比较Java覆盖信息收集工具比较
Java覆盖信息收集工具比较Tao He
 
Smart debugger
Smart debuggerSmart debugger
Smart debuggerTao He
 
Testing survey
Testing surveyTesting survey
Testing surveyTao He
 
Testing survey by_directions
Testing survey by_directionsTesting survey by_directions
Testing survey by_directionsTao He
 
Django
DjangoDjango
DjangoTao He
 
基于覆盖信息的软件错误定位技术综述
基于覆盖信息的软件错误定位技术综述基于覆盖信息的软件错误定位技术综述
基于覆盖信息的软件错误定位技术综述Tao He
 
Mutation testing
Mutation testingMutation testing
Mutation testingTao He
 
A software fault localization technique based on program mutations
A software fault localization technique based on program mutationsA software fault localization technique based on program mutations
A software fault localization technique based on program mutationsTao He
 

En vedette (9)

Introduction to llvm
Introduction to llvmIntroduction to llvm
Introduction to llvm
 
Java覆盖信息收集工具比较
Java覆盖信息收集工具比较Java覆盖信息收集工具比较
Java覆盖信息收集工具比较
 
Smart debugger
Smart debuggerSmart debugger
Smart debugger
 
Testing survey
Testing surveyTesting survey
Testing survey
 
Testing survey by_directions
Testing survey by_directionsTesting survey by_directions
Testing survey by_directions
 
Django
DjangoDjango
Django
 
基于覆盖信息的软件错误定位技术综述
基于覆盖信息的软件错误定位技术综述基于覆盖信息的软件错误定位技术综述
基于覆盖信息的软件错误定位技术综述
 
Mutation testing
Mutation testingMutation testing
Mutation testing
 
A software fault localization technique based on program mutations
A software fault localization technique based on program mutationsA software fault localization technique based on program mutations
A software fault localization technique based on program mutations
 

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

六步教你学会简单Rmi
六步教你学会简单Rmi六步教你学会简单Rmi
六步教你学会简单Rmiyiditushe
 
啟動 Laravel 與環境設定
啟動 Laravel 與環境設定啟動 Laravel 與環境設定
啟動 Laravel 與環境設定Shengyou Fan
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践yiditushe
 
Spring框架,技术详解及使用指导
Spring框架,技术详解及使用指导Spring框架,技术详解及使用指导
Spring框架,技术详解及使用指导yiditushe
 
Google protocol buffers简析
Google protocol buffers简析Google protocol buffers简析
Google protocol buffers简析wavefly
 
Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1netdbncku
 
5, system admin
5, system admin5, system admin
5, system adminted-xu
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7javatwo2011
 
Oraliux+mysql5单机多实例安装文档
Oraliux+mysql5单机多实例安装文档Oraliux+mysql5单机多实例安装文档
Oraliux+mysql5单机多实例安装文档xuebao_zx
 
Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]yiditushe
 
Puppet安装测试
Puppet安装测试Puppet安装测试
Puppet安装测试Yiwei Ma
 
程式設計師的自我修養 Chapter 8
程式設計師的自我修養 Chapter 8程式設計師的自我修養 Chapter 8
程式設計師的自我修養 Chapter 8Shu-Yu Fu
 
Web testing automation
Web testing automationWeb testing automation
Web testing automationkuozui
 
使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)Max Lai
 

Similaire à C语言benchmark覆盖信息收集总结4 (20)

gnutool
gnutoolgnutool
gnutool
 
Gnu
GnuGnu
Gnu
 
六步教你学会简单Rmi
六步教你学会简单Rmi六步教你学会简单Rmi
六步教你学会简单Rmi
 
啟動 Laravel 與環境設定
啟動 Laravel 與環境設定啟動 Laravel 與環境設定
啟動 Laravel 與環境設定
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践
 
Spring框架,技术详解及使用指导
Spring框架,技术详解及使用指导Spring框架,技术详解及使用指导
Spring框架,技术详解及使用指导
 
beidakejian
beidakejianbeidakejian
beidakejian
 
Google protocol buffers简析
Google protocol buffers简析Google protocol buffers简析
Google protocol buffers简析
 
Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1
 
OSGi Small Lab
OSGi Small LabOSGi Small Lab
OSGi Small Lab
 
5, system admin
5, system admin5, system admin
5, system admin
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7
 
Oraliux+mysql5单机多实例安装文档
Oraliux+mysql5单机多实例安装文档Oraliux+mysql5单机多实例安装文档
Oraliux+mysql5单机多实例安装文档
 
Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]
 
Puppet安装测试
Puppet安装测试Puppet安装测试
Puppet安装测试
 
PHPUnit
PHPUnitPHPUnit
PHPUnit
 
程式設計師的自我修養 Chapter 8
程式設計師的自我修養 Chapter 8程式設計師的自我修養 Chapter 8
程式設計師的自我修養 Chapter 8
 
Web testing automation
Web testing automationWeb testing automation
Web testing automation
 
运维自动化
运维自动化运维自动化
运维自动化
 
使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)
 

Plus de Tao He

Java 并发编程笔记:01. 并行与并发 —— 概念
Java 并发编程笔记:01. 并行与并发 —— 概念Java 并发编程笔记:01. 并行与并发 —— 概念
Java 并发编程笔记:01. 并行与并发 —— 概念Tao He
 
Testing group’s work on fault localization
Testing group’s work on fault localizationTesting group’s work on fault localization
Testing group’s work on fault localizationTao He
 
Muffler a tool using mutation to facilitate fault localization 2.0
Muffler a tool using mutation to facilitate fault localization 2.0Muffler a tool using mutation to facilitate fault localization 2.0
Muffler a tool using mutation to facilitate fault localization 2.0Tao He
 
Muffler a tool using mutation to facilitate fault localization 2.3
Muffler a tool using mutation to facilitate fault localization 2.3Muffler a tool using mutation to facilitate fault localization 2.3
Muffler a tool using mutation to facilitate fault localization 2.3Tao He
 
Semantic Parsing in Bayesian Anti Spam
Semantic Parsing in Bayesian Anti SpamSemantic Parsing in Bayesian Anti Spam
Semantic Parsing in Bayesian Anti SpamTao He
 
Problems
ProblemsProblems
ProblemsTao He
 
A survey of software testing
A survey of software testingA survey of software testing
A survey of software testingTao He
 
Cleansing test suites from coincidental correctness to enhance falut localiza...
Cleansing test suites from coincidental correctness to enhance falut localiza...Cleansing test suites from coincidental correctness to enhance falut localiza...
Cleansing test suites from coincidental correctness to enhance falut localiza...Tao He
 
Concrete meta research - how to collect, manage, and read papers?
Concrete meta research - how to collect, manage, and read papers?Concrete meta research - how to collect, manage, and read papers?
Concrete meta research - how to collect, manage, and read papers?Tao He
 

Plus de Tao He (9)

Java 并发编程笔记:01. 并行与并发 —— 概念
Java 并发编程笔记:01. 并行与并发 —— 概念Java 并发编程笔记:01. 并行与并发 —— 概念
Java 并发编程笔记:01. 并行与并发 —— 概念
 
Testing group’s work on fault localization
Testing group’s work on fault localizationTesting group’s work on fault localization
Testing group’s work on fault localization
 
Muffler a tool using mutation to facilitate fault localization 2.0
Muffler a tool using mutation to facilitate fault localization 2.0Muffler a tool using mutation to facilitate fault localization 2.0
Muffler a tool using mutation to facilitate fault localization 2.0
 
Muffler a tool using mutation to facilitate fault localization 2.3
Muffler a tool using mutation to facilitate fault localization 2.3Muffler a tool using mutation to facilitate fault localization 2.3
Muffler a tool using mutation to facilitate fault localization 2.3
 
Semantic Parsing in Bayesian Anti Spam
Semantic Parsing in Bayesian Anti SpamSemantic Parsing in Bayesian Anti Spam
Semantic Parsing in Bayesian Anti Spam
 
Problems
ProblemsProblems
Problems
 
A survey of software testing
A survey of software testingA survey of software testing
A survey of software testing
 
Cleansing test suites from coincidental correctness to enhance falut localiza...
Cleansing test suites from coincidental correctness to enhance falut localiza...Cleansing test suites from coincidental correctness to enhance falut localiza...
Cleansing test suites from coincidental correctness to enhance falut localiza...
 
Concrete meta research - how to collect, manage, and read papers?
Concrete meta research - how to collect, manage, and read papers?Concrete meta research - how to collect, manage, and read papers?
Concrete meta research - how to collect, manage, and read papers?
 

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

  • 1. Software-artifact Infrastructure Repository(SIR) C 语言程序集覆盖信息收集总结 中山大学 软件工程实验室 贺韬(elfinhe@gmail.com) 2011-5-24
  • 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=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 版权所有 请勿翻印 内部资料 请勿外传
  • 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. 中山大学 软件工程实验室 择主要参考了 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. 版权所有 请勿翻印 内部资料 请勿外传