我正在开发一个小型库,我不想在可能出现的每个地方都处理分配错误,因此我编写了一个malloc()
的包装器,如果出现错误,它将终止程序(目前如此)。
void *cstr_malloc(size_t size)
{
void *buf = malloc(size);
if (!buf)
{
fprintf(stderr, "Allocation error, terminating\n");
exit(2);
}
return buf;
}
没有什么花哨的东西。然而,我注意到clang静态分析器(至少在Xcode中)不会像以前一样捕获明显的泄漏。
如果我做这样的事情:
void foo(void)
{
void *p = malloc(100);
}
如果我自然地知道,p
很可能会泄漏内存。
但是,有了...
void foo(void)
{
void *p = malloc(100);
void *q = cstr_malloc(100);
}
它只报告 p
泄漏,而不是q
。
这很有道理;它不能知道程序在哪里分配内存并且在合理的时间内分析它。如果我将分配器内联,它可以很好地处理,因此它能看见它,但否则它就不能看见。
有没有办法告诉分析器我有一个函数返回新分配的内存?类似于 __attribute__((malloc))
或类似的属性吗?
当然,我可以将函数内联,但我还有一堆类似地分配内存的其他函数,如果将它们全部内联将会很麻烦。
p
的警告,而没有看到(同样分配的)q
的警告。它没有看到(当然,在这里也看不到)q
也分配了内存。 - Thomas Mailundp
,但是下面代码高亮却在q
上。很令人困惑的东西。 - StoryTeller - Unslander Monica