Splint在跟踪C代码中的内存泄漏方面做得很好。每个malloc()都应该有一个匹配的free()。但是BoehmGC收集的代码使用没有匹配GC_FREE()的GC_MALLOC()。这让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;
}发布于 2011-08-02 05:53:47
我认为您应该将BoehmGC应用程序接口本身注释为,然后示例所需的注释(如果有的话)将变得显而易见。
对于初学者来说,没有注释的函数返回的任何指针都是隐式的@only,这意味着您必须在引用丢失之前释放相关的内存。因此,第一步是注释分配器,以便它们不再返回@only引用。相反,该手册建议使用shared references
如果使用Splint检查设计用于垃圾回收环境的程序,则可能存在由一个或多个引用共享且从未显式释放的存储。shared注解声明了可以任意共享但从不释放的存储。
如果您不想修改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。
https://stackoverflow.com/questions/6903272
复制相似问题