6

我正在寻找类似的注释

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

安抚铿锵静态分析器的野兽。我能找到的唯一可行的属性链接是GCC,但它甚至不包括ns_returns_retained,我认为它在扩展中。

编辑:

至于为什么需要这样做,我有一个在简单情况下无法重现的场景,因此它可能与 Objective-C 项目中的 ac 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);
}
4

1 回答 1

6

函数注释ownership_returns(malloc)将告诉 Clang 静态分析器该函数返回一个指针,该指针应该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测试文件。)

目前,这些注解仅在alpha.unix.MallocWithAnnotations检查器运行时生效(默认不运行)。如果您使用的是 Xcode,则需要添加-Xclang -analyzer-checker=alpha.unix.MallocWithAnnotations到您的构建标志。

于 2013-04-29T23:44:18.387 回答