2011-12-10 16 views
21

के साथ सी प्रोग्राम की यादृच्छिक पीढ़ी क्या कोई भी सी प्रोग्रामों के यादृच्छिक जनरेटर को जानता है जिसमें फ़्लोटिंग-पॉइंट कंप्यूटेशंस शामिल हैं?फ्लोटिंग-पॉइंट

मैं कुछ ऐसा ढूंढ रहा हूं जो 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 कार्यक्रम लेने और प्रतिस्थापन, कहते हैं, int64_t float के साथ एक वाक्य रचना सही सी कार्यक्रम दे सकता है, यह लगभग निश्चित रूप से नहीं एक परिभाषित कार्यक्रम दे देंगे। मैं जांच सकता हूं कि एक प्रतिस्थापित कार्यक्रम में अनिर्धारित व्यवहार है, लेकिन यह सस्ता नहीं है, और यदि मुझे 99% प्रतिस्थापित कार्यक्रमों को अस्वीकार करना है क्योंकि वे अपरिभाषित हैं, तो प्रक्रिया उपयोगी होने में बहुत धीमी होगी।

+1

मैं पूरी तरह वंचित नींद रहा हूँ पर अधिक तो मुझसे पूछें, तो माफ करना अगर यह बेवकूफ है, लेकिन मैं यह अधिकार पढ़ रहा हूँ? आप यादृच्छिक रूप से सी प्रोग्राम उत्पन्न करना चाहते हैं? पहुंच से बहुत दूर! आप पर अच्छा! क्यूं कर? : पी – TheIronKnuckle

+1

@TheIronKnuckle "अंतर परीक्षण" के लिए: दो अलग-अलग कंपाइलरों के साथ एक यादृच्छिक रूप से जेनरेट * परिभाषित * सी प्रोग्राम संकलित करें, और यदि प्रोग्राम अलग-अलग परिणाम देते हैं, तो आपको कंप्यूटर्स में से एक में एक बग मिला है। http://www.linux-mips.org/pub/linux/mips/people/macro/DEC/DTJ/DTJT08/DTJT08PF.PDF –

+1

@TheIronKnuckle खैर, यह फ़्लोटिंग-पॉइंट के साथ थोड़ा और जटिल है, क्योंकि फ़्लोटिंग -पॉइंट सी 99 में अंडरस्पेस्फीड किया गया है, और दो कंपाइलर्स दोनों सही होंगे और फ़्लोटिंग पॉइंट की उपस्थिति में अलग-अलग परिणाम देंगे। यही कारण है कि सुविधा कोस्मिथ में शामिल नहीं किया गया था। लेकिन मुझे अभी भी लगता है कि मैं अपने उद्देश्य के लिए यादृच्छिक फ्लोटिंग-पॉइंट प्रोग्राम का उपयोग करने में सक्षम हूं। –

उत्तर

3

मैंने एक छोटे से floating-point fuzzer पर शुरू किया है। यह अभी के लिए बहुत कम है, लेकिन आपको कुछ शुरू करना है।

यहाँ SSE2 निर्देश पैदा compilers की तुलना के लिए उपयोग का एक उदाहरण है, मैं दावा है कि अलग-अलग परिणाम पैदा करने के लिए कोई बहाना नहीं है:

#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); 
} 

इस कार्यक्रम के लिए, gcc और clang (जो इस मंच पर 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 प्रोग्राम कुछ समान (पूर्णांक पर) कर रहा है। आप इसे अपनी आवश्यकताओं के लिए आसानी से अनुकूलित कर सकते हैं।

मुझे लगता है कि एक छोटे से हैक के रूप में, कुछ लोगों को समझाने के लिए विशेष रूप से Jacques Pitrat, कि एक Linux सिस्टम dlopen एक बहुत बड़ा बहुत साझा वस्तुओं की (हजारों से अधिक सौ), कि कार्यक्रम उत्पन्न कर सकते हैं यादृच्छिक सी कोड पूर्णांकों पर -focused लिखा था - और संकलन और dlopen-फिर उनमें से बहुत से निष्पादित करता है। आप इसे फ्लोटिंग पॉइंट जरूरतों के अनुकूल बना सकते हैं। मैंने अपना manydl.c डिज़ाइन किया है ताकि यह यादृच्छिक लेकिन सी प्रोग्राम को समाप्त कर सके, ताकि आप इसे फ्लोट करने के लिए अनुकूलित कर सकें (केवल उन परिचालनों को चुनें जो समाप्त हो रहे हैं और सस्ते हैं, जैसे मैंने किया)।

अभी कॉफी समय

(क्योंकि हम करीब सहयोगियों कर रहे हैं)