2015-04-17 6 views
10

की ओर जाता है, मैं सी ++ स्रोत का पता लगाने या कम करने का एक तरीका ढूंढ रहा हूं, जब प्रीप्रोसेस्ड, बड़े आकार में फैलता है, ताकि जीसीसी स्मृति से बाहर हो जाए।सी/सी ++ प्रीप्रोसेसर दुर्व्यवहार का पता लगाएं जो विशाल विस्तारित कोड आकार

नमूना कोड:

#include <iostream> 
using namespace std; 
int main() { 
    #define A30 cout << "hello world"; 
    #define A29 if (1) { A30 } else { A30 } 
    #define A28 if (0) { A29 } else { A29 } 
    // ... you get the idea ... 
    #define A1 if (1) { A2 } else { A2 } 
    #define A0 if (0) { A1 } else { A1 } 
    A0 
    return 0; 
} 

इस कार्यक्रम संकलन, एक विशाल वाक्य रचना सही है, तो-और कुछ पेड़ (छोटे संस्करणों के साथ काम करता है, कहते हैं, ए 10 तक) उत्पन्न करनी चाहिए; अगर निष्पादित किया जाता है, तो यह उस पेड़ के भीतर 2^30 "हैलो वर्ल्ड" तारों में से एक को छोटा प्रिंट करता है। हालांकि, एक 8GB मशीन पर संकलन का प्रयास कर अनुत्तरदायी व्यवहार का कारण बनता है और (कुछ समय के बाद) निम्न त्रुटि प्रदर्शित करने के लिए:

internal compiler error: Segmentation fault 
A0 
^ 

यह जीसीसी 4.9.x का उपयोग करके उपरोक्त मामले में पूर्व प्रोसेसर विस्तार को सीमित करना संभव है, या अन्यथा ऐसे कार्यक्रमों से दुर्घटनाग्रस्त होने से बचें?

+7

जबकि पेचीदा, आप पाया है वास्तव में यह एक वास्तविक दुनिया का उदाहरण है? मुझे लगता है कि अगर आपके मैक्रोज़ इस गड़बड़ कर रहे हैं तो आप कहीं और गलत कर रहे हैं ... – Qix

+0

@Qix ने ऑनलाइन कंपाइलर्स (उदाहरण: प्रोग्रामिंग प्रतियोगिताओं) के खिलाफ इसका परीक्षण नहीं किया है, लेकिन सोचने का कारण है कि यह कुछ प्रभावित कर सकता है; मुझे लगता है कि मैं इसके बारे में सोचने वाला पहला व्यक्ति नहीं हूं, और कुछ सी ग्रे-दाढ़ी अपने ट्रैक पर इसे रोकने के लिए एक अस्पष्ट जीसीसी ध्वज को जान लेंगे। – tucuxi

+0

मेरा मतलब है कि एक अजीब दुनिया प्रोग्राम_ है जो इस तरह के गहन कोड उत्पन्न कर रहा है _really_ एक मुद्दा है? – Qix

उत्तर

1

जहां तक ​​मुझे पता है कि आप एक सरल जीसीसी कमांड के साथ क्या हासिल करने की कोशिश कर रहे हैं, ऐसा करने का कोई तरीका नहीं है। इसके चारों ओर एक तरीका भी आपके निर्माण प्रणाली में कुछ अतिरिक्त कदम जोड़ सकता है, यह देखने के लिए कि कोई प्रतिबद्धता एक निश्चित प्रतिशत द्वारा कोड आधार को बढ़ाती है या नहीं।

आपके पास जीसीसी में एक विकल्प (-E) है जो प्री-प्रोसेसर चरण के बाद कोड आउटपुट करता है।

यदि आपके पास प्रतिबद्धता 1 पर कोई बिल्ड है, तो आप उस प्रतिबद्धता पर लाइनों की संख्या को बचा सकते हैं, जीईसी के साथ चल रहे हैं, और इसके आउटपुट पर "wc -l" कर सकते हैं।

पर प्रतिबद्ध 2, निर्माण से पहले, आप एक ही करते हैं, और जाँच करें कि लाइनों की संख्या एक सीमा है कि आप परिभाषित में वृद्धि न होने (10%, 20%?)

+0

मेरा मानना ​​है कि यह (और @ पोटेमकिंडेक्स का उत्तर उलिमिट और वीएस प्रागमा का उपयोग कर) एकमात्र व्यावहारिक दृष्टिकोण है, भले ही वे केवल जीसीसी नहीं हैं। अगले कुछ दिनों में कुछ भी बेहतर नहीं होने पर मैं इस जवाब को स्वीकार करूंगा। – tucuxi

संबंधित मुद्दे