Splint可以很好地跟踪C代码中的内存泄漏。每个malloc()
都应该匹配free()
。但BoehmGC收集的代码使用GC_MALLOC()
而没有匹配的GC_FREE()
。这使得Splint对大量有关内存泄漏的消息感到疯狂。
是否有人知道此类代码的正确注释,以便Splint不再显示虚假的内存泄漏消息?
特别是,有人可以注释Wikipedia's BoehmGC的例子吗?
#include <assert.h>
#include <stdio.h>
#include <gc.h>
int main(void)
{
int i;
GC_INIT();
for (i = 0; i < 10000000; ++i)
{
int **p = GC_MALLOC(sizeof(int *));
int *q = GC_MALLOC_ATOMIC(sizeof(int));
assert(*p == 0);
*p = GC_REALLOC(q, 2 * sizeof(int));
if (i % 100000 == 0)
printf("Heap size = %zu\n", GC_get_heap_size());
}
return 0;
}
答案 0 :(得分:2)
我认为您应该注释 BoehmGC API本身,然后示例所需的注释(如果有的话)将变得明显。
对于初学者,没有注释的函数返回的任何指针都是隐式@only
,这意味着您必须在引用丢失之前释放相关内存。因此,第一步是注释分配器,以便它们不再返回@only
引用。相反,本手册建议使用共享参考:
如果使用Splint检查设计用于a的程序 垃圾收集环境,可能存在共享的存储 一个或多个引用,从未明确发布。共享 注释声明可以任意共享但永远不会共享的存储 释放。
如果您不想修改BoehmGC API,可以通过创建正确的带注释的包装函数来解决它。此外,您需要在包装函数中禁用特定的传输错误(因为它们从BoehmGC API获得隐式@only
引用,然后将其作为@shared
返回)。
例如,这是在代码的给定位置禁用“语句无效”错误的方法:
/*@-noeffectuncon@*/
not_annotated_void_function();
/*@=noeffectuncon@*/
包装函数将是这样的:
/*@shared@*/ /*@null@*/ /*@out@*/ static void * MY_GC_MALLOC(size_t size) /*@*/{
/*@-onlytrans@*/
return( GC_MALLOC(size) );
/*@=onlytrans@*/
}
然后在示例中,您使用MY_GC_MALLOC
而不是GC_MALLOC
。