Csmith——生成用于测试的随机C程序

(1 min to read)

Csmith 能够随机生成没有未定义行为的C程序(借助静态规则和运行时检查),用于编译器、静态分析器等处理源代码的工具的测试。

注意:生成的程序可能包含死循环,并且毕竟是随机生成的,与人写的代码还是有很大区别的。而且Csmith 只能生成C程序,不能生成C++程序yarpgen可以随机生成C++程序。

随机测试+差分测试

包含如下三步:

  • 使用Csmith生成大量有效的C程序
  • 用不同版本的编译器运行同一个C程序
  • 比较编译器的输出,以多数的结果作为正确输出

Csmith 随机测试+差分测试

安装

1
2
3
4
5
git clone https://github.com/csmith-project/csmith.git
cd csmith
sudo apt install g++ cmake m4
cmake -DCMAKE_INSTALL_PREFIX=$HOME/csmith .
make && make install

这里的m4是一个文本处理工具,通常用于宏处理和文本替换。它可以用来编写、维护和生成各种类型的文本文件,包括配置文件、脚本、程序源代码等。

运行

1
2
export PATH=$PATH:$HME/csmith/bin
csmith > random1.c

注:生成的程序的输出固定为checksum = xxx的形式,通过比较运行后输出的checksum的值来判断编译器是否正确编译。