我正在寻找类似
的注释-(SomeStruct *) structFromInternals __attribute__((returns_malloced_ptr))
{
SomeStruct *ret = malloc(sizeof(SomeStruct));
//do stuff
return ret;
}
安抚clang静态分析仪动物。
我能找到的唯一可行的属性链接是for 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);
}
答案 0 :(得分: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
test file。)
目前,这些注释仅在运行alpha.unix.MallocWithAnnotations
检查程序时生效(默认情况下不运行)。如果您使用的是Xcode,则需要在构建标记中添加-Xclang -analyzer-checker=alpha.unix.MallocWithAnnotations
。