如何为Splint收集BoehmGC收集的代码?

时间:2011-08-01 19:21:25

标签: c memory-leaks lint splint boehm-gc

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;
}

1 个答案:

答案 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