随机生成具有浮点的C程序

Pas*_*uoq 21 c floating-point ieee-754 random-testing

有谁知道包含浮点计算的C程序的随机生成器?

我正在寻找一些有点像Csmith的东西,除了Csmith不会生成浮点表达式,并且它会产生大量其他构造,使得修改有点困难.生成顺序计算对我来说是一个良好的开端,只要这些包括一些浮点数.条件会更好,但我不需要循环,指针,甚至数组.

由于这么多语言使用类C语法,这样的生成器可能不必特定于C.即使它特定于另一种类C语言,我也许能够将生成的语言文本处理为C程序.

编辑:这是一个Csmith生成的程序的片段,以澄清我在寻找什么.

...
int64_t *l_374 = &g_189;
int32_t l_375 = (-1L);
int i, j, k;
l_375 &= ((g_106 == ((*l_374) = (&g_324[4] == l_373[0][0][5]))) < 0x80C8L);
return (*g_207);
...
Run Code Online (Sandbox Code Playgroud)

我也应该澄清的是,虽然采取了输入csmith程序而代,比方说,int64_tfloat可以给一个语法正确的C程序,它几乎肯定不会给一个定义的程序.我可以测试替换程序是否包含未定义的行为,但这并不便宜,如果我必须拒绝99%的替换程序,因为它们未定义,过程将太慢而无法使用.

Pas*_*uoq 3

我已经开始开发一个小型浮点模糊器。目前它作用不大,但你必须从一些事情开始。

\n\n

下面是一个用于比较生成 SSE2 指令的编译器的示例,我声称没有理由生成不同的结果:

\n\n
#include <stdio.h>\ndouble x0 = 35945970.47e-83;\ndouble x1 = (973e-37+(5626073.612783921311173024e-76*231.106261545926274055e1*66390306733994e-1*420514.99786508*654374994.1249111e-35*5201.6039804e56)+(2.93604195+33e-50)+(969222843.32046212043603+1734e01)+(0166605914e8+6701040019050623e-23+32591206968562.6e-11+90771798.753788905)+(328e-49/944642906580982081e7));\n\nint main(){\n  x0 = (((x1*534425399171e0)*(x1*x0*x0)*(x1*x0*57063248719.703555336277392e-36*x0*472e57*65189741246535e-1)*x1*(x1/22393742341e70)*(x1+x0+x0+x0))-((843193503867271987e3*61.949746266e23*x1*x1*x0)/(x1/x1)));\n  x0 = ((x0+x1+x1+x1+x0)-(x0*506680.0005767722e66*396.650621163*70798334426455964.1*x1*305369e14));\n  x1 = 660098705340e-21;\n  printf("%a\\n", x0);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于该程序,gccand clang(在此平台上生成 SSE2 指令)生成计算相同内容的可执行文件:

\n\n
~/genfloat $ gcc t.c ; ./a.out \n0x1.5c5a77a63c1d6p+430\n~/genfloat $ clang t.c ; ./a.out \n0x1.5c5a77a63c1d6p+430\n
Run Code Online (Sandbox Code Playgroud)\n\n

我还打算测试一个静态分析器,它应该预测使用 x87 指令编译的程序可以获得的所有可能结果,以不可预测的方式将一些中间结果溢出到双精度内存位置:

\n\n
~/genfloat $ frama-c -val -float-hex -all-rounding-modes t.c \n...\n      x0 \xe2\x88\x88 [0x1.5c5a77a63c1cap430 .. 0x1.5c5a77a63c1e8p430]\n
Run Code Online (Sandbox Code Playgroud)\n\n

以上是一个强有力的主张,需要进行检验。

\n