3

Splint在跟踪 C 代码中的内存泄漏方面做得很好。每个都malloc()应该有一个匹配的free(). 但是 BoehmGC 收集的代码使用GC_MALLOC()没有匹配GC_FREE()的 . 这使得 Splint 对大量实际上并不存在的内存泄漏消息发疯了。

有谁知道此类代码的正确注释,以便 Splint 不再显示虚假的内存泄漏消息?

特别是,有人可以注释维基百科的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;
}
4

1 回答 1

2

我认为您应该对 BoehmGC API 本身进行注释,然后示例所需的注释(如果有)将变得显而易见。

对于初学者,没有注释的函数返回的任何指针都是隐式@only的,这意味着您必须在引用丢失之前释放关联的内存。因此,第一步是注释分配器,使它们不再返回@only引用。相反,该手册建议使用共享引用

如果 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.

于 2011-08-01T21:53:46.653 回答