2013-04-29 3 views
6

मैंक्या malloc'd सूचक के लिए __attribute __ ((ns_returns_retained)) के बराबर है?

-(SomeStruct *) structFromInternals __attribute__((returns_malloced_ptr)) 
{ 
    SomeStruct *ret = malloc(sizeof(SomeStruct)); 
    //do stuff 
    return ret; 
} 

की तरह एक टिप्पणी के कुछ के लिए देख रहा हूँ बजना स्थिर विश्लेषक जानवरों पीड़ा कम करने के लिए। एकमात्र व्यावहारिक विशेषता लिंक जो मैं पा सकता हूं वह for GCC है, लेकिन इसमें ns_returns_retained भी शामिल नहीं है, जो एक विस्तार में है, मुझे लगता है।

संपादित करें:

क्यों यह आवश्यक है के रूप में, मैं एक परिदृश्य है कि मैं एक साधारण मामले में repro नहीं कर सकते हैं, तो यह एक ऑब्जेक्टिव-सी परियोजना में एसी lib साथ क्या करना है हो सकता है ... सार, है मैं एक स्थिर विश्लेषक चेतावनी है कि createStruct में malloc लीक कर रहा है मिलती है:

typedef struct{ 
    void * data; 
    size_t len; 
}MyStruct; 

void destroyStruct(MyStruct * s) 
{ 
    if (s && s->data) { 
     free(s->data); 
    } 
    if (s) { 
     free(s); 
    } 
} 
MyStruct * createStructNoCopy(size_t len, void * data) 
{ 
    MyStruct * retStruct = malloc(sizeof(MyStruct)); 
    retStruct->len = len; 
    retStruct->data = data; 
    return retStruct; 
} 
MyStruct * createStruct(size_t len, void * data) 
{ 
    char * tmpData = malloc(len); 
    memcpy(tmpData, data, len); 
    return createStructNoCopy(len, tmpData); 
} 
MyStruct * copyStruct(MyStruct * s) 
{ 
    return createStruct(s->len, s->data); 
} 
+0

आपको इसकी आवश्यकता क्यों है? –

+0

बस इसे दस्तावेज़ में लिखें। –

उत्तर

5

समारोह एनोटेशन ownership_returns(malloc) बजना स्थिर विश्लेषक कि समारोह एक सूचक है कि कुछ बिंदु पर free() को पारित किया जाना चाहिए रिटर्न बता देंगे (या ownership_takes(malloc, ...) के साथ एक समारोह)। उदाहरण के लिए:

void __attribute((ownership_returns(malloc))) *my_malloc(size_t); 
void __attribute((ownership_takes(malloc, 1))) my_free(void *); 
... 
void af1() { 
    int *p = my_malloc(1); 
    return; // expected-warning{{Potential leak of memory pointed to by}} 
} 
void af2() { 
    int *p = my_malloc(1); 
    my_free(p); 
    return; // no-warning 
} 

(उनके उपयोग के कुछ और उदाहरण के लिए malloc-annotations.c test file देखें।) फिलहाल, इन टिप्पणियों को केवल लागू हो जाते हैं alpha.unix.MallocWithAnnotations चेकर चलाया जाता है (जो डिफ़ॉल्ट रूप से नहीं चलाया जाता है) । यदि आप एक्सकोड का उपयोग कर रहे हैं, तो आपको अपने निर्माण झंडे में -Xclang -analyzer-checker=alpha.unix.MallocWithAnnotations जोड़ना होगा।

+0

उत्कृष्ट, धन्यवाद। –

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