突变测试已经存在一段时间了,似乎至少有一个或两个用于 C/C++ 的商业突变测试框架。你用过它们吗?你有什么经验?有没有开源替代品?
6 回答
一个简短的搜索结果是:
- PlexTest: http ://www.itregister.com.au/products/plextest_detail.htm
- 保险++: http ://www.parasoft.com/jsp/products/insure.jsp;jsessionid=baacpvbaDywLID?itemId=63
- MILU(可能只针对C): http ://www.dcs.kcl.ac.uk/pg/jiayue/milu/
话虽如此,您需要意识到突变测试并不是特别有用(至少从我以前读过的一些东西来看)。当面对困难的(隐喻的)断言时,它是一个有趣的工具,用于确保注意数据需求(在处理if and only if
情况时)。
在我看来,有很多更成熟的方法来分析代码的健壮性。
请注意,Parasoft 的工具仅生成等效突变。这与维基百科关于突变测试的文章中描述的问题相呼应——很难区分等效突变和非等效突变,因此他们决定坚持使用等效突变。
我尝试了另一个有趣的工具,它可以自动发现检测的 C 和 C++ 代码中的不变量——它被称为“Daikon”。本质上,它与生成等效突变的工具做同样的事情,但它不是识别有问题的代码,而是为您提供一组不变量,例如“A == B + 1”。我认为不变量更有用,因为当您查看发现的不变量时,它可以确保您的代码在不变量有意义的情况下是正确的,然后您可以将不变量转换为断言,这让您在更改代码时更有信心。
用于变异 c 程序的直接 python 脚本可在以下位置获得:
https://github.com/parunbabu/mutate.py
作者说,如果被测代码被取消注释和缩进,效果会更好。
而且它也是免费和开源的......我认为这就是你正在寻找的。
- Mull是基于 LLVM 的,并且似乎正在积极开发且易于使用。
- dextool mutate也是基于 LLVM 并积极开发的,使用更复杂,但具有更多功能,例如重新运行活着的突变体,并且仅 mutate 引入了基于
git diff
我没有这方面的经验,但 Mutate++ 似乎是已经提到的选项中缺少的选项。
现有框架的设置和使用太耗时,所以我自己实现了一个快速简单的解决方案,可以在任何机器上运行。有适用于 MacOSX、Windows 和 RaspberryPi (Linux) 的二进制文件:
https://github.com/RagnarDa/dumbmutate
希望它可以帮助任何人!