程序频谱
关于程序频谱(Program Spectrum)和基于程序频谱的缺陷定位(SFL, Spectrum Fault Localization),定义和介绍如下:
Program spectra, also known as code coverage, can be defined as a set of program entities covered during test execution . Spectrum-based fault localization uses information from program entities executed by test cases to indicate entities more likely to be faulty. There are several synonyms of program spectrum used in the literature, such as code coverage, testing data, dynamic information, execution trace, execution path, path profile, and execution profile.
程序频谱,也称为代码覆盖,记录了程序在执行期间的实体覆盖情况。而基于程序频谱的缺陷定位,就是利用这些执行信息,进行软件的缺陷定位的技术。
目标
在西门子测试集中,已 replace 程序为例子,该例子中包含:
- 一个正确版本的程序,和 32 个错误版本(每个版本引入了一个 Bug)
- 5542 个测试用例,可以为每个版本程序产生 5542 个测试输出
目标输出:
- 对于每个错误版本,获得他们在每个测试用例下的语句执行频谱。例如:对于 v31 的程序,执行频谱是一个 5542 行,570列(程序编译生成的 replace.c.gcov 的行数) 的 0-1 矩阵。其中,每个 TestCase 对应频谱矩阵的一行。
- 对于每个错误版本,获取 5542 个测试用例的结果矩阵,通过置 0,失败置 1。
例如,对于第 10 个测试用例,如果程序的第 5 行被执行了,则频谱矩阵 X 中的 ,如果该测试用例成功了(输出结果和正确版本输出相同),则结果矩阵 R[10] = 0。
GCOV 工具使用
是 gcc 自带的程序覆盖分析工具。参考文章: gcov使用
使用方法:
- 编译程序时,加入参数,会额外生成 .gcno和.gcda两个文件
- 调用执行 replace 程序
- 执行命令 ,会输出覆盖率信息,并生成 文件,其中记录了每行程序被执行的频度信息。
replace.c.gcov 文件截取
- 每次编译一次程序,执行一个 TestCase ,记录本次频谱。然后重新编译程序,执行下一个 TestCase,在获取本次频谱,如此循环,获得所有 5542个测试用例的频谱。
- 只编译一次程序,每次执行一次 TestCase,记录当前语句执行的总频度,并和上次执行的频度比较,从而得出哪些语句在本次执行中被覆盖。
我选择了第二种,用一个 Python 脚本(X.py)实现。该脚本每次调用,会查看一次 replace.c.gcov 文件,统计本次 TestCase 的频谱,加入到 频谱记录文件中。

结果矩阵的生成
所谓结果矩阵,只要将正确程序生成的输出文件和该版本生成的输出相比较即可。相同为通过,置0,不同为失败,置 1。
因此,一个简单的 python 脚本即可实现。
最后的自动化脚本
为每个版本生成一个 runall.sh 后,用一个 Shell 脚本实现依次调用。这样只需要一个命令就可以实现 32 个错误程序的频谱和结果信息的生产。
最终生产 32 个版本程序的信息,在 i5-6500U 机器上执行时间为 一小时左右。
总结
- 执行环境: Linux
- 需要技能: shell 脚本编程,python 脚本编程
- 一切自动化,可以节省大量时间
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!