csmith-project/csmith

GitHub: csmith-project/csmith

Csmith 是一款能够生成无未定义行为的随机 C 程序的工具,主要用于通过差分测试发现编译器缺陷。

Stars: 1170 | Forks: 168

# ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/4f687989aa211945.png) ## 关于 Csmith 是一个随机 C 程序生成器。它的主要目的是通过使用差分测试作为测试预言机,利用随机程序来发现编译器错误。 Csmith 也可以用于编译器测试领域之外。如果你的应用程序需要一个 C 程序测试套件,而你又不想费力去编写它们,不妨试试 Csmith。 Csmith 输出的 C 程序不含未定义行为(相信我们,这并非易事),并且会附带每个生成程序的统计信息。 ## 安装 Csmith 你可以通过从[此处(即将推出)](doc/releases.md)下载的压缩包来安装 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 上构建](doc/build-csmith-on-windows.md)的具体说明。 ## 使用 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 进行编译器测试](http://embed.cs.utah.edu/csmith/using.html)的文档,虽然稍有陈旧但仍然相关。 ## 历史 Csmith 最初由犹他大学 (University of Utah) 的以下人员开发: * [Xuejun Yang](https://github.com/jxyang) * [Yang Chen](https://github.com/chenyang78) * [Eric Eide](https://github.com/eeide) * [John Regehr](https://github.com/regehr) 这是编译器测试研究项目的一部分。我们的论文[Finding and Understanding Bugs in C Compilers](https://www.cs.utah.edu/~regehr/papers/pldi11-preprint.pdf)(发现并理解 C 编译器中的错误)对该研究进行了最好的总结。 更多研究信息可以在[这里](http://embed.cs.utah.edu/csmith/)找到。 Csmith 于 2009 年开源。我们尝试利用业余时间将其作为一个开源项目继续维护。因此,对错误报告或功能请求的回复可能会有所延迟。 ## 社区 请使用 GitHub [issues](https://github.com/csmith-project/csmith/issues/new)来报告错误或提出建议。 我们有一个用于讨论 Csmith 的邮件列表。 请访问[这里](http://www.flux.utah.edu/mailman/listinfo/csmith-dev)进行订阅。
标签:Bash脚本, Clang, GCC, LLVM, 云安全监控, 代码生成, 可配置连接, 回归测试, 威胁情报, 差分测试, 开发者工具, 开源安全工具, 数据管道, 未定义行为, 模糊测试框架, 测试用例生成, 渗透测试工具, 程序分析, 编译器Bug检测, 编译器测试, 软件工程, 软件测试工具, 逆向工程平台, 随机测试生成器, 静态分析