c - 如何为 Splint 注释 BoehmGC 收集的代码?

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

最佳答案

我认为您应该注释BoehmGC API 本身,然后示例所需的注释(如果有)就会变得明显。

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

If Splint is used to check a program designed to be used in a garbage-collected environment, there may be storage that is shared by one or more references and never explicitly released. The shared annotation declares storage that may be shared arbitrarily, but never released.

如果您不想修改 BoehmGC API,您可以通过创建正确注释的包装函数来解决它。此外,您需要在包装函数中禁用特定的传输错误(因为它们从 BoehmGC API 获取隐式 @only 引用,然后将其返回为 @共享)。

例如,您可以通过以下方式在代码的给定点禁用“语句无效”错误:

/*@-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

关于c - 如何为 Splint 注释 BoehmGC 收集的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6903272/

相关文章:

c++ - glibc 应用程序保留未使用的内存直到退出

eslint - 在同一项目中一起使用ESLint和stylelint是一个好主意

ios - 椰子足 : how to push spec to my private repo without lint?

c - 二叉搜索树不添加元素

CGFX 着色器多次输出垂直数据

在预处理器指令中组合 ## 和 _type

c - 关于集群客户端服务器通信的任何建议。方法?

Java Runtime.maxMemory 不正确?

javascript - 在 Chrome 中获取大型 AJAX 响应而不会崩溃

sass - 让 scss-lint 忽略特定行