- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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 中使用 MySQL 时,您可以使用 MySQL API 释放内存,如下所示: MYSQL* connection = NULL; connection = mysql_init(NULL);
我一直在尝试Splint使用我最近编写的 C 程序并试图理解和删除它给出的警告。一个我理解但无法理解如何删除它的代码来自以下代码片段: static MyType_t *findById(const
使用 C 中的简单链表实现,我如何告诉 Splint 我正在转让 data 的所有权? typedef struct { void* data; /*@null@*/ void* ne
我想使用 Splint 来检测具有相同底层类型的 typedef 之间的隐式转换,例如以下代码: typedef int counter; typedef int delta; static int
我有一个程序可以执行如下操作: #include #include int f(char *result) { if (result != NULL) { *res
我有一个程序使用无符号字符来表示小范围的整数。我发现自己需要在程序的几个不同部分将它们清除为 0,我最近也开始使用夹板,显然: unsigned char c = 0; 发出警告: Variable
Splint很好地追踪 C 代码中的内存泄漏。每个malloc() 都应该有一个匹配的free()。但 BoehmGC 收集的代码使用 GC_MALLOC() 且没有匹配的 GC_FREE()。这使得
我正在尝试让 splint 与我正在处理的嵌入式项目一起工作。我想知道是否有一个示例 .splintrc 选项文件,我可以向其中添加自己的选项/配置以简化整个过程。我正在使用 IAR 工作台编译和构建
根据Splint FAQ : For Win32, Splint looks for splint.rc instead of .splintrc due to the DOS filename li
以下代码编译和执行时没有任何警告或错误。但是,当我使用 splint分析代码,它显示了 4 个警告(显示在代码下方)。 我见过的大多数示例(带有此类警告)都使用 malloc 和 free。由于此代码
我正在使用嵌入式系统 XC8 C 编译器(用于 PIC 微处理器)。允许以下内容: bit foo(){ //... } 但作为非标准 C,Splint 静态分析器给出以下错误: Parse
我在 Splint 文档中搜索了“fresh storage”,发现有提及,但没有正式定义。其他修饰符,如 null 或 only,我理解并正在使用。我只是不确定新鲜存储是什么。 情况是这样的: vo
对于以下程序: int main(void) { int value = 2; int result = value >> 1U; return result; } ...Sp
我编译(没有警告)来自“The Linux Kernel Module Programming Guide”的hello-5.c 示例,当我尝试对其进行 insmod 时,我收到以下错误: insmo
我有一些 C 代码,其中包含专有遗留应用程序的 header 。我无法修改标题。我收到以下代码的夹板解析错误: #if defined(HAS_LONGLONG) /* removed for
我正在尝试使用 Splint使用 MySQL C API 并遇到了一些与释放内存相关的其他问题。在我能找到的有关使用 C API 的所有示例中,唯一调用的释放函数是 mysql_free_result
两者都是数学值,但 float 确实更精确。这是错误的唯一原因 - 精度差异吗?还是存在其他潜在(且更严重)的问题? 最佳答案 这是因为整数值集不等于“int”和“float”类型的浮点值集。例如,浮
我是一名优秀的程序员,十分优秀!