2016-04-24 5 views
7

तो प्रश्न यह आसान है कि जीसीसी को बताने का कोई तरीका है कि अगर मैं एक ढेर आवंटित ब्लॉक को मुक्त नहीं करता हूं तो मुझे चेतावनी देना है? मुझे पता है कि हमारे पास कुछ उद्देश्यों के लिए गैर-मुक्त ब्लॉक हो सकते हैं/हम पहले से ही कार्यक्रम के अंत तक पहुंच गए हैं या ऐसा कुछ भी कर सकते हैं।जीसीसी गैर-मुक्त हेप ब्लॉक के लिए चेतावनी

int main(){ 
    int *a = malloc(sizeof(int)); 
    return 0; 
} 

यदि मैं इसके लिए भी चेतावनी प्राप्त कर सकता हूं तो यह बहुत ही अच्छा होगा।

+4

जीसीसी? बिलकूल नही। Valgrind हाँ – Idos

+0

@Idos मुझे पता है Valgrind जांच सकते हैं, लेकिन अगर दुर्घटना से पहले चेतावनियां प्राप्त करने का कोई तरीका था तो यह वास्तव में कमाल होगा। –

उत्तर

3

जीसीसी के लिए यह संभव काम नहीं है। स्टेटिक विश्लेषण यह साबित नहीं कर सकता कि एक मुक्त भूल गया है, यह रन-टाइम विश्लेषकों का काम है जैसे valgrind's मेमचेक, या अंत में gcc -fsanitize=leak, जिसे मैंने yet नहीं देखा है, केवल clang -fsanitize=leak के साथ।

लेकिन आपको संकलन-समय चेतावनी नहीं मिलेगी, भले ही जीसीसी या क्लैंग इसका समर्थन करे। यह एक रन-टाइम चेतावनी होगी।

+0

लेकिन रनटाइम प्रत्येक स्थिति के साथ थोड़ा अलग नहीं है। तो क्या यह साबित नहीं हो सकता है क्योंकि कार्यक्रम के सभी राज्यों की जांच करने के लिए इसे बहुत अधिक समय की आवश्यकता होगी? –

+0

'-fsanitize = leak' केवल एक अनुकूलन है, AFAIK आप केवल '-fsanitize = address' के साथ संकलित कर सकते हैं जो gcc के साथ ठीक काम करता है। –

+0

याकप: हाँ रन-टाइम केवल परीक्षणों में लीक को पकड़ लेगा, न कि अनदेखा लोगों को। मार्क: -fsanitize = पता वास्तव में एक रिसाव नहीं पकड़ेगा, -fsanitize = स्मृति करता है, लेकिन रिसाव और valgrind सबसे अच्छे हैं। – rurban

2

संकलक गैर-मुक्त ब्लॉक के लिए भविष्यवाणी और चेतावनी नहीं दे सकता है। यह रनटाइम नौकरी है, समय संकलित नहीं है। आप अपने स्वयं के मॉलोक-फ्री-चेक सबसिस्टम को कार्यान्वित कर सकते हैं या मेमोरी प्रबंधन लाइब्रेरी को संशोधित कर सकते हैं।

+0

मुझे पता है कि एक कंपाइलर जांच नहीं कर सकता है कि स्मृति को ढेर से आवंटित किया गया है, लेकिन मैंने सिखाया कि एक विशेषता होगी जो "ढेर आवंटन कार्यों" द्वारा उपयोग की जाती है। यह संभव होगा। –

+0

मुझे लगता है कि स्मृति प्रबंधन के नैदानिक ​​कार्यान्वयन हैं। कार्यक्रम में पते के लिए प्रत्येक आवंटित ब्लॉक को अतिरिक्त जानकारी होनी चाहिए जहां इसे आवंटित किया गया है ('malloc' के साथ)। फिर आप प्रोग्राम समाप्ति पर कुछ '_mem_leak' फ़ंक्शन को कॉल कर सकते हैं जो सभी गैर-मुक्त ब्लॉक के लिए स्कैन करेगा। – i486

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