首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为Splint注释BoehmGC收集的代码?

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

Stack Overflow用户
提问于 2011-08-02 03:21:25
回答 1查看 352关注 0票数 3

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

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

具体地说,有人可以注释一下Wikipedia's BoehmGC示例吗?

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-02 05:53:47

我认为您应该将BoehmGC应用程序接口本身注释为,然后示例所需的注释(如果有的话)将变得显而易见。

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

如果使用Splint检查设计用于垃圾回收环境的程序,则可能存在由一个或多个引用共享且从未显式释放的存储。shared注解声明了可以任意共享但从不释放的存储。

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

例如,这是您在代码的给定点禁用“语句没有效果”错误的方式:

代码语言:javascript
复制
/*@-noeffectuncon@*/
not_annotated_void_function();
/*@=noeffectuncon@*/

包装器函数将如下所示:

代码语言:javascript
复制
/*@shared@*/ /*@null@*/ /*@out@*/ static void * MY_GC_MALLOC(size_t size) /*@*/{
    /*@-onlytrans@*/
    return( GC_MALLOC(size) );
    /*@=onlytrans@*/
}

那么在本例中,您将使用MY_GC_MALLOC而不是GC_MALLOC

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6903272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档