- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在我的 C 程序中,我使用 malloc()
分配内存,与 calloc()
相比,不 初始化内存,它可能仍然包含垃圾。大多数情况下,在分配上下文中,我不会对 malloc()
分配的内存进行任何更改。 (例如,在初始化包含缓冲区的结构的函数中,我不会更改缓冲区的内存,但稍后会更改)。
Valgrind 给了我很多这些错误:
我确定在这些情况下永远不会从未初始化的内存中读取数据。
我应该忽略它们还是在分配时初始化内存更好?如果我应该忽略它们,如何在 Valgrind 中停用此错误消息?
示例 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, source, 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;
}
}
最佳答案
在这两种情况下,您只是分配内存而不初始化它。最简单的方法是使用 calloc
而不是 malloc
将其归零。对于简单的情况,这可能是一个很好的策略,例如,如果您稍后使用 buffer
作为要打印的字符串。对于更复杂的用例,将值分配给各个字段,或者如果您让 C99 从复合文字分配整个结构,那就更好了:
toto * t = malloc(sizeof(*t));
*t = (toto){ 0 };
关于c - Valgrind, "uninitialized value(s)"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11246344/
我想问一个让我困惑的问题。我正在尝试扫描字符串并将其转换为实数。使用该数字来计算值(value)。这是我的代码: string input_file_name1 = "shen_test_38_30_
我正在为我的 C 类入门编写一个程序,当我尝试使用 gcc 进行编译时,我不断收到一些警告。 这是我的代码: char **outList; *outList = strdup(cloudDevice
我正在使用 Chromium 嵌入式框架。我将以下内容放在主函数中。 CefRefPtr cef; CefRequest::ReferrerPolicy origin = origin; cef->S
我是C++的新手,正在测试while循环以及C++的绝对速度及其对我的CPU的影响,但出现以下错误: Severity Code Description Project File Line Suppr
string foo; try { foo = "test"; // yeah, i know ... } catch // yeah, i know this one too :) {
当尝试在 Mac OS X 10.6 上使用 FFMPEG gem 时,ruby 会抛出一个 NameError 异常,如下所示: NameError: uninitialized constant
我做了一个程序来计算 View 的总宽度/高度(有时我想要总宽度,有时我想要总高度)。唯一的问题是:如果我正在计算宽度,我想添加一个额外的 10到总数。这是我当前的代码: func calculate
所以我只想从常规地址(字符串)中提取经度/纬度坐标。我查阅了 geokit gem 文档并按照记录的内容进行了操作,但我不断收到此错误:“NameError:未初始化的常量 Geokit::Geoco
为什么 perl -we '$c = $c+3' 上升 Use of uninitialized value $c in addition (+) at -e line 1. perl -we '$c
我有以下代码: class circularList { public: circularList() : data(0), next(this) {} public: int dat
我的情况 我正在 ASP.NET MVC4 应用程序中进行测试。我正在开发的应用程序部分将现代 WebSecurity/SimpleMembershipProvider 与正在逐步淘汰的遗留身份验证系
我是 Ruby on Rails 的新手,我想使用迁移生成 mysql 数据库。 我尝试过这个命令 ruby bin/rake db:drop db:create db:migrate --trace
我需要一些调试帮助,因为我遇到的错误真的很难。 这是一款具有复杂动画的游戏。然而,问题不在于 SpriteKit .我希望动画按照严格的顺序彼此跟随,所以我实现了 Operation 的子类: cla
这是一个示例代码: #include int main() { int n = 5; float v[n]; float sum; int i; for(i
我正在使用 SQL Server 2012 并尝试实现事务复制。我正在使用系统存储过程来创建发布和订阅。我成功地创建了这些东西,但是当我检查复制监视器时,它显示“未初始化的订阅”。 当我检查订阅的同步
我有以下脚本: use 5.12.4; use strict; use warnings; say "Enter a functionality:"; while (<>) { if (/ad
我已经阅读了有关 has_many 的文档和大量教程:通过 Rails 中的关系,但我终生无法掌握它的窍门。 我正在尝试向我的 current_user(devise) 添加一个组,并且我在 Grou
我正在尝试为移动 API 设置路由,它应该有一个版本化的 api-path。我已经可以让移动 Auth 工作了,这是在位于 的单独 Controller AuthController 中实现的。/co
我正在使用 luacheck(在 Atom 编辑器中),但对其他静态分析工具开放。 有没有办法检查我是否使用了未初始化的表字段?我阅读了文档( http://luacheck.readthedocs.
我有一家工厂,例如: FactoryGirl.define do factory :page do title 'Fake Title For Page' end end 并进行测试:
我是一名优秀的程序员,十分优秀!