关于
Csmith 是一个 C 程序的随机生成器。它的主要目的是通过随机程序找出编译器的 bug,使用差异测试作为测试标准。
Csmith 可以在编译器测试领域之外使用。如果你的应用需要一套 C 程序测试套件,而你不想自己编写,可以尝试使用 Csmith。
Csmith 输出的 C 程序不包含未定义行为(相信我们,这并不简单),并提供每个生成程序的统计信息。
安装 Csmith
你可以从这里(即将推出)下载 tarball 安装 Csmith,或者从源代码构建。以下命令适用于 Ubuntu。
git clone https://github.com/csmith-project/csmith.git
cd csmith
sudo apt install g++ cmake m4
cmake -DCMAKE_INSTALL_PREFIX=<安装前缀> .
make && make install
请参阅在 Windows 上构建的具体说明。
使用 Csmith
假设 Csmith 被本地安装到 $HOME/csmith
。你可以简单地通过以下方式生成、编译和执行测试用例:
export PATH=$PATH:$HOME/csmith/bin
csmith > random1.c
gcc random1.c -I$HOME/csmith/include -o random1
./random1
要将差异测试加入其中,我们需要安装另一个编译器,例如另一个版本的 gcc 或 clang。然后重复以下过程:
csmith > random2.c
gcc random2.c -I$HOME/csmith/include -o random2_gcc
clang random2.c -I$HOME/csmith/include -o random2_clang
./random2_gcc > gcc_output.txt
./random2_clang > clang_output.txt
如果 gcc_output.txt
和 clang_output.txt
有任何差异,那么你就发现了 gcc 或 clang 中的一个 bug,或者在不太可能的情况下,发现了 Csmith 本身的 bug。
你可以用你喜欢的语言编写脚本,重复上述过程,以增强随机差异测试的威力。
生成的程序可能包含无限循环。最佳做法是对它们的执行应用超时限制。
使用 csmith -h
或 csmith -hh
查看可以传递给 Csmith 的命令行选项列表,以自定义随机生成。
这里有一份稍微过时但仍然相关的文档,介绍了如何使用 Csmith 进行编译器测试。
历史
Csmith 最初由犹他大学的以下人员开发:
作为编译器测试研究项目的一部分。这项研究最好通过我们的论文Finding and Understanding Bugs in C Compilers来总结。更多研究信息可以在这里找到。
Csmith 于 2009 年开源。我们尽量利用业余时间将其作为开源项目继续维护。因此,对 bug 报告或功能请求的响应可能会有所延迟。
社区
请使用 github issues 报告 bug 或提出建议。
我们有一个讨论 Csmith 的邮件列表。请访问这里订阅。