对于malloc指针,是否有等效的__attribute __((ns_returns_retained))?

Gra*_*yer 6 c static-analysis objective-c clang

我正在寻找类似的注释

-(SomeStruct *) structFromInternals __attribute__((returns_malloced_ptr))
{
    SomeStruct *ret = malloc(sizeof(SomeStruct));
    //do stuff
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

安抚铿锵静态分析仪的野兽.我能找到的唯一可行的属性链接是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);
}
Run Code Online (Sandbox Code Playgroud)

一二三*_*一二三 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
}
Run Code Online (Sandbox Code Playgroud)

(有关其使用的更多示例,请参阅malloc-annotations.c测试文件.)

目前,这些注释仅在alpha.unix.MallocWithAnnotations运行检查程序时生效(默认情况下不运行).如果您正在使用Xcode,则需要添加-Xclang -analyzer-checker=alpha.unix.MallocWithAnnotations到构建标志中.