6

के साथ मेमोरी लीक कैसे ढूंढें मैंने अपने सी कोड में मेमोरी लीक खोजने के लिए अपनी मशीन (उबंटू) में क्लैंग स्थापित किया है। इस प्रकार मैं इसे की कार्यप्रणाली की जांच करने के लिए है, जिसमें एक नमूना कोड लिखा है:क्लैंग

/* File: hello.c for leak detection */ 
#include <stdio.h> 
#include <stdlib.h> 

void *x; 

int main() { 
    x = malloc(2); 
    x = 0; // Memory leak 
    return 0; 
} 

मैं

$ scan-build clang --analyze hello.c 

और

$ scan-build clang -fsanitize=address hello.c 

तरह संकलित करने के लिए इंटरनेट में कुछ विकल्प मिल गया लेकिन उनमें से कोई भी स्मृति रिसाव के किसी भी संकेत दिखा रहे हैं।

स्कैन-निर्माण: स्थिर विश्लेषण
स्कैन-निर्माण के लिए उपयोग करना '/ usr/bin/बजना': निर्देशिका हटाने में '/ tmp/स्कैन-निर्माण 2015-07-02-122717-16928-1' क्योंकि इसमें कोई रिपोर्ट नहीं है।
स्कैन-बिल्ड: कोई भी बग नहीं मिला।

क्या कोई कृपया बता सकता है कि मेमोरी लीक डिटेक्शन के लिए क्लैंग का सही तरीके से उपयोग कैसे किया जाए।

+0

अपने प्रोग्राम का परीक्षण करते समय [valgrind] (http://valgrind.org) का उपयोग करें। इस तरह की बग सामान्य मामले में स्थिर रूप से खोजना असंभव है (लेकिन कुछ औजारों को ह्यूरिस्टिक या रूढ़िवादी रूप से कुछ बग मिल सकती हैं)। और '-fsanitize = address' जोड़ता है * रनटाइम चेक * इसलिए आपको प्रोग्राम चलाने की आवश्यकता है। –

+0

क्या आपने '$ स्कैन-बिल्ड क्लैंग -fsanitize = address -g hello.c' कोशिश की? –

+0

$ स्कैन-बिल्ड क्लैंग -fsanitize = address -g hello.c हाँ मैंने कोशिश की –

उत्तर

2

दिलचस्प बात यह है बजना स्थिर विश्लेषक स्मृति रिसाव पाता है अगर आप की घोषणा void *xmain अंदर:

hello.c:9:3: warning: Potential leak of memory pointed to by 'x' 
    return 0; 
    ^~~~~~~~ 
:

scan-build clang -g hello.c 

समान एक चेतावनी देता है:

int main() { 
    void *x = malloc(2); 
    x = 0; // Memory leak 
    return 0; 
} 

इस कोड का विश्लेषण चलाकर