2013-04-29 25 views
6

Tôi đang tìm kiếm một cái gì đó chú thích nhưCó tương đương với __attribute __ ((ns_returns_retained)) cho một con trỏ malloc'd không?

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

để làm dịu vang thú phân tích tĩnh. Liên kết thuộc tính khả thi duy nhất tôi có thể tìm thấy là for GCC, nhưng nó thậm chí không bao gồm ns_returns_retained, mà là trong một phần mở rộng, tôi giả định.

EDIT:

như tại sao điều này là cần thiết, tôi có một kịch bản mà tôi không thể repro trong một trường hợp đơn giản, vì vậy nó có thể phải làm với ac lib trong một dự án Objective-C ... các ý chính là, tôi nhận được một cảnh báo phân tích tĩnh rằng malloc trong createStruct đang bị rò rỉ:

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

Tại sao bạn cần điều này? –

+0

Chỉ cần viết nó trong tài liệu. –

Trả lời

5

chức năng chú thích ownership_returns(malloc) sẽ cho máy phân tích tĩnh Clang mà hàm trả về một con trỏ đó phải được chuyển vào free() tại một số điểm (hoặc một hàm với ownership_takes(malloc, ...)). Ví dụ:

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 
} 

(Xem malloc-annotations.c test file cho một số ví dụ khác về việc sử dụng chúng.)

Tại thời điểm này, các chú thích này chỉ có hiệu lực khi alpha.unix.MallocWithAnnotations kiểm tra được điều hành (mà không phải chạy theo mặc định) . Nếu bạn đang sử dụng Xcode, bạn cần phải thêm -Xclang -analyzer-checker=alpha.unix.MallocWithAnnotations vào cờ xây dựng của mình.

+0

tuyệt vời, cảm ơn bạn. –

Các vấn đề liên quan