2013-04-29 15 views
6

Czekam na coś adnotacji jakCzy istnieje odpowiednik __attribute __ ((ns_returns_retained)) dla wskaźnika malloc'd?

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

aby uspokoić dzyń statycznych bestie analizatora. Jedynym możliwym atrybutem atrybutu, jaki mogę znaleźć, jest for GCC, ale nie zawiera ono nawet ns_returns_retained, która jest w rozszerzeniu, jak przypuszczam.

EDIT:

, dlaczego jest to potrzebne, Mam scenariusz, że nie mogę Repro w prostym przypadku, więc może mieć do czynienia z ac lib w projekcie Objective-C ... Istotą jest, dostaję statyczny ostrzeżenie analizatora że malloc w createStruct wyciekają:

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

Dlaczego tego potrzebujesz? –

+0

Po prostu napisz to w dokumentacji. –

Odpowiedz

5

funkcja adnotacji ownership_returns(malloc) powie statyczny analizator dzyń, że funkcja zwraca wskaźnik, który powinien być przekazany do free() w pewnym momencie (lub funkcja z ownership_takes(malloc, ...)). Na przykład:

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 
} 

(Zobacz malloc-annotations.c test file na trochę więcej przykładów ich użycia.)

Obecnie te adnotacje działają dopiero wtedy, gdy kontroler alpha.unix.MallocWithAnnotations prowadzony jest (co nie jest uruchamiany domyślnie) . Jeśli używasz Xcode, musisz dodać -Xclang -analyzer-checker=alpha.unix.MallocWithAnnotations do swoich flag kompilacji.

+0

świetnie, dziękuję. –

Powiązane problemy