2013-04-29 15 views
6

Ben clang statik analiz hayvanlar yatıştırmayaMallaştırılmış bir işaretçi için __attribute __ ((ns_returns_retained)) bir eşdeğer var mı?

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

gibi bir ek açıklama şey arıyorum. Bulabildiğim tek geçerli öznitelikler bağlantısı for GCC'dur, ancak bir uzantıdaki ns_returns_retained'u içermez, varsayalım.

DÜZENLEME:

bu gereklidir neden olarak, bunun bir Objective-C projesinde AC lib ile yapmak zorunda kalabilirsiniz bu yüzden basit bir durumda üreme olmayan bir senaryo var ... yüreğin CREATESTRUCT malloc sızdırılmış olması statik analiz uyarısı alıyorum, geçerli:

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

Neden buna ihtiyacınız var? –

+0

Sadece belgeye yazın. –

cevap

5

fonksiyon fonksiyonu bir noktada free() iletilmesi gereken bir işaretçi döndürür Clang statik analizörü söyleyecektir açıklama ownership_returns(malloc) (veya ownership_takes(malloc, ...) ile bir işlev). Örneğin:

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 
} 

(kullanımlarının bazı daha fazla örnek için malloc-annotations.c test file bakın.)

Şu anda bu açıklamalar sadece etkili olması alpha.unix.MallocWithAnnotations denetleyicisi çalıştırıldığında (varsayılan olarak çalışmaz olan) . Xcode kullanıyorsanız, yapı bayraklarınıza -Xclang -analyzer-checker=alpha.unix.MallocWithAnnotations eklemeniz gerekir.

+0

mükemmel, teşekkürler. –