微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Valgrind,“未初始化的值”错误

在我的C程序中,我使用malloc()分配内存,与calloc() ,它不初始化内存,它可能仍然包含垃圾。 大多数情况下,在分配的上下文中,我不会对malloc()分配的内存进行任何更改。 (例如,在初始化包含缓冲区的结构的函数中,我不会更改缓冲区的内存,但稍后会进行更改)。

Valgrind给了我很多错误

条件跳转或移动取决于未初始化的值(s)

使用大小为4的未初始化的值

我肯定永远不会从这些情况下未初始化的内存中读取。

我应该忽略它们还是更好地初始化分配内存? 万一我应该忽略它们,我怎样才能在Valgrind中closures这个错误信息呢?

在Windows C ++下的链接库中的静态初始化

如果C尝试扫描整型variables中的字符,会发生什么情况

初始化模块在Apache2

使用memset等结构初始化({…})是否可以吗?

运行自定义init:无法产生主页主进程:无法执行:没有这样的文件或目录

例1

==4253== Conditional jump or move depends on uninitialised value(s) ==4253== at 0x408EB8E: vfprintf (vfprintf.c:1624) ==4253== by 0x4093C2E: printf (printf.c:35) ==4253== by 0x40624D2: (below main) (libc-start.c:226) ==4253== Uninitialised value was created by a heap allocation ==4253== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==4253== by 0x8048938: gk_StreamBufferNode_init (stream.c:101) ==4253== by 0x8048D0D: gk_Stream_bufferWriteProc (stream.c:252) ==4253== by 0x8048665: main (main.c:21)

代码

int gk_StreamBufferNode_init(gk_StreamBufferNode* node,int buffer_size,gk_AllocProc malloc) { node->buffer = malloc(buffer_size); // line 101 if (node->buffer == NULL) { return GKIT_FailedALLOC; } node->next = NULL; return GKIT_NOERR; }

例2

==4253== Conditional jump or move depends on uninitialised value(s) ==4253== at 0x402DA39: memcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==4253== by 0x8048C6E: gk_Stream_bufferWriteProc (stream.c:230) ==4253== by 0x8048665: main (main.c:21) ==4253== Uninitialised value was created by a heap allocation ==4253== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==4253== by 0x8048CE0: gk_Stream_bufferWriteProc (stream.c:248) ==4253== by 0x8048665: main (main.c:21)

代码

/* ... */ int available_bytes = binfo->buffer_size - bnode->filled; int bytes_to_go = size * count; int offset = 0; int node_offset = 0; gk_StreamBufferNode* new_node; void* destination = NULL; void* source = NULL; while (bytes_to_go > 0) { destination = bnode->buffer + bnode->filled + node_offset; source = buffer + offset; if (available_bytes > bytes_to_go) { memcpy(destination,source,bytes_to_go); // line 230 bnode->filled += bytes_to_go; offset += bytes_to_go; node_offset = bytes_to_go; bytes_to_go = 0; } else { memcpy(destination,available_bytes); offset += available_bytes; node_offset = 0; bytes_to_go -= available_bytes; bnode->filled += available_bytes; #ifdef DEBUG assert(bnode->filled == bnode->buffer_size); #endif // DEBUG // Allocate a new buffer node. new_node = (gk_StreamBufferNode*) malloc(sizeof(gk_StreamBufferNode)); // line 248 if (new_node == NULL) { return GKIT_FailedALLOC; } int success = gk_StreamBufferNode_init(new_node,binfo->buffer_size,malloc); if (success <= GKIT_ERROR) { free(new_node); return GKIT_FailedALLOC; } bnode->next = new_node; bnode = new_node; available_bytes = binfo->buffer_size; } }

如何在Linux上初始化一个共享库

Windows错误:访问被拒绝H2o深度学习框架使用Python进行初始化

“min”成员的类的C ++初始化列表

初始化脚本是否需要守护进程?

在recvfrom调用中,向量指向未初始化的字节

在这两种情况下,您只是分配内存而不进行初始化。 最简单的方法是使用calloc而不是malloc来将其清零。 对于简单的情况,这可能是一个很好的策略,例如,如果以后使用buffer作为要打印的字符串。 对于更复杂的用例,将值赋给单个字段,或者如果C99从复合文字中指定整个结构,则更好:

toto * t = malloc(sizeof(*t)); *t = (toto){ 0 };

你的代码不应该期望未初始化的内存包含任何值,所以有条件跳转取决于这些显示严重的问题。

您应该初始化内存(对于某个已知的值,例如0 ),或者不要参考其内容,除非它们已经被初始化。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐