2011-12-10 18 views
21

浮動小数点計算を含むCプログラムのランダム生成器を知っている人はいますか?浮動小数点計算を含むCプログラムのランダム生成

Csmithのようなものを探していますが、Csmithは浮動小数点式を生成せず、他にもたくさんの構造体が生成されるため、変更が少し難しくなります。逐次計算を生成することは、いくつかの浮動小数点演算を含む限り、私の目的にとっては良いスタートになります。条件式はさらに優れていますが、ループ、ポインタ、または配列を必要としません。

非常に多くの言語がCのような構文を使用しているので、そのようなジェネレータはC固有のものでなくてもかまいません。別のC言語に特有のものでも、生成されたプログラムをテキスト処理できます。その言語をCプログラムに組み込みます。

EDIT:私が探しているものを明確にするために、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); 
... 

私もCsmithプログラムを取り、floatint64_t が構文的に正しいCプログラムを与える可能性があり、たとえば、置き換えながら、それはほぼ確実に定義されたプログラムを与えないことを明確にすべきです。置換プログラムに未定義のビヘイビアが含まれているかどうかをテストできますが、これは安価ではありません。置換されたプログラムの99%を未定義にする必要がある場合、処理が遅すぎて便利になりません。

+1

を掲載していませんかランダムにCプログラムを生成したいですか?遠くまで!よかったね!どうして? :P – TheIronKnuckle

+1

@ TheIronKnuckle "differential testing"の場合:ランダムに生成された*定義された* Cプログラムを2つの異なるコンパイラでコンパイルし、プログラムが異なる結果を出す場合、コンパイラの1つにバグが見つかりました。 http://www.linux-mips.org/pub/linux/mips/people/macro/DEC/DTJ/DTJT08/DTJT08PF.PDF –

+1

@ TheIronKnuckle浮動小数点では少し複雑です-pointはC99で規定されておらず、2つのコンパイラは両方とも正しく、浮動小数点の存在で異なる結果を与えるでしょう。このため、この機能はCsmithには含まれていませんでした。しかし、私はまだ私の目的のためにランダムな浮動小数点プログラムを使用できると思う。 –

答えて

3

私は小さいから始まったfloating-point fuzzer。それは今のところほとんど行いませんが、あなたは何かで始める必要があります。このプラットフォームではSSE2命令を生成

#include <stdio.h> 
double x0 = 35945970.47e-83; 
double 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)); 

int main(){ 
    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))); 
    x0 = ((x0+x1+x1+x1+x0)-(x0*506680.0005767722e66*396.650621163*70798334426455964.1*x1*305369e14)); 
    x1 = 660098705340e-21; 
    printf("%a\n", x0); 
} 
このプログラムのために

gccclang(:ここ

は、私は異なる結果を生成するための言い訳を持っていないと主張することを、SSE2命令を生成するコンパイラを比較するための使用例であります

~/genfloat $ gcc t.c ; ./a.out 
0x1.5c5a77a63c1d6p+430 
~/genfloat $ clang t.c ; ./a.out 
0x1.5c5a77a63c1d6p+430 

は、私もプログラムを得ることができるすべての可能な結果を​​予測することになっている静的アナライザをテストするつもり:)同じことを計算する実行可能ファイルを生成します予測不可能な様式で倍精度メモリ位置にいくつかの中間結果をこぼし、のx87命令にコンパイル:

~/genfloat $ frama-c -val -float-hex -all-rounding-modes t.c 
... 
     x0 ∈ [0x1.5c5a77a63c1cap430 .. 0x1.5c5a77a63c1e8p430] 

上記を試験する必要が強い主張です。

1

私のmanydl.cプログラムは(整数で)非常に似たようなことをしています。あなたはあなたのニーズにそれを非常に簡単に適応させるかもしれません。

は、私は小さなハックとしてLinuxシステムはdlopen非常に大きな多くは共有オブジェクトの(何千もの以上百)は、そのプログラムは、ランダムなCコードの整数で-focused生成することができ、特にJacques Pitratを何人かの人々を説得することを書きましたコンパイルし、dlopen -sはそれらの多くを実行します。あなたはそれを浮動小数点のニーズに適応させることができます。私は自分のmanydl.cを設計して、ランダムであるが終了するCプログラムを生成するようにしたので、浮動小数点に適応させることができます。

私は完全にこれは愚かであれば、今とても残念奪わ寝るんだけど、私はこの権利を読んでいます?(私たちは近い同僚であるため)よりコーヒータイムに

関連する問題