2013-04-29 68 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,我認爲這是一個擴展。

編輯:

,爲什麼這是需要的,我有,我不能在簡單的情況下攝製,所以它可能在一個Objective-C的項目與交流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

爲什麼你需要這個? – 2013-04-29 18:17:34

+0

只需將其寫入文檔即可。 – 2013-04-29 18:54:27

回答

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檢查時(這是默認情況下不運行) 。如果您使用Xcode,則需要將-Xclang -analyzer-checker=alpha.unix.MallocWithAnnotations添加到您的構建標誌。

+0

優秀,謝謝。 – 2013-04-30 14:26:36

相關問題