- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
问题:
在工作中加载数据,但是当尝试从节点 valgrind 检索存储的 text_ 时抛出“条件跳转”。 text_ 仍然被正确检索并显示。
导致问题的原因:
这是代码片段,是 readFile() 函数的一部分,这个特定的 fread() 导致了问题。
int readFile(char **text, ...)
...
size_text = filesize - previous_position;
*text = (char *)malloc(size_text + 1);
fread(*text, 1, size_text, input);
Valgrind 消息:
==18139== Conditional jump or move depends on uninitialised value(s)
==18139== at 0x48303C7: __GI_strlen (vg_replace_strmem.c:455)
==18139== by 0x48EA17F: vfprintf (vfprintf.c:1637)
==18139== by 0x48EF955: printf (printf.c:33)
==18139== by 0x108F6A: game (version-3.c:243)
==18139== by 0x109085: main (version-3.c:287)
==18139== Uninitialised value was created by a heap allocation
==18139== at 0x482D27C: malloc (vg_replace_malloc.c:299)
==18139== by 0x108BBC: readFile (version-3.c:125)
==18139== by 0x108D4A: BuildTree (version-3.c:197)
==18139== by 0x109074: main (version-3.c:286)
==18139==
解决方案
添加空终止符可修复此错误。最初的假设是,它已经以空值终止,这是由于空值终止符 *text[size_text] = '\0'; 的错误放置所致。 -> 抛出错误(*text)[size_text] = '\0'; -> 修复错误
最佳答案
错误不会发生在 fread()
中。它发生在 __GI_strlen
中。这意味着该函数的逻辑所依赖的变量未初始化或未完全初始化。
因为您知道 *strlen
应该做什么(计算字符数,C 字符串中终止的 \0
除外),您可以推断出问题是:您已经使用 malloc()
编辑了一个特定大小的缓冲区,但是包含 \0
终止符的字符串并没有完全占据它。因此,缓冲区中存在未初始化的尾随空间,因此会出现错误。
因此最好检查返回值 fread()
以确认究竟读取了多少字节。它不能保证读取您要求的元素数量(在您的情况下为字节数):它可能会返回错误,或者读取任意数量的元素最多您指定的限制。
将 null 终止符显式放置在您的缓冲区中将是另一个好主意! (你错过了它。)
关于c - fread() 导致 Valgrind 错误 : "Conditional jump or move depends on uninitialised value(s)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47602816/
所以我得到了这段代码,我应该将其放入我的代码中,该代码使用 getopt_long() 函数从命令行读取选项,并通过切换菜单传递它们。问题在于该函数,如果我不初始化 long_opts 的值,我会收到
现在,首先,我已经在该站点上阅读了其他答案,以及有关 jackson 序列化的其他答案,但是它们都提供了忽略null字段的方法。但是,在Java中,int不能是null。 我正在尝试将Java对象Ob
这个 valgrind 输出让我感到困惑,因为它似乎没有引用我的代码,而且我在使用 STL 编写的多个程序中都得到了它,尽管没有 HEAP SUMMARY 错误: $ valgrind -v --le
我写了一个小的 c 程序,它获取 3 个名称作为输入,然后将这三个值存储到一个节点。这三个值(名称)存储在数组 JOHNJAKEMATT 中,每个名称有 4 个字符。结果节点如下所示: /* poin
我正在写一个 linux 模块,这里是代码片段。它提示变量的统一化使用,但我想我已经检查过了在使用它之前有足够的检查。我认为这可能是相关的ERR_PTR 和 PTR_ERR 宏,但我不知道为什么。有人
我是 IOS 开发和处理内存泄漏的新手。在我的项目中,在分析项目时我遇到了一些内存泄漏。但是我无法在下面的代码中修复下面的逻辑错误。 CGRect labelframe; if ([questonmo
我分配一个二维数组并使用 memset 用零填充它。 #include #include #include void main() { int m=10; int n =10;
我有以下程序 http://ideone.com/1RPs8E .它使用可变参数函数 tlog 将在日志文件中打印一行。它接收打印行的级别、文件名、一行和调试信息的函数以及 printf 的格式和参数
我们正在尝试建立一个哈希表和一些用于设置、获取和删除表中值的过程。我们在第 35 行和第 53 行遇到“条件跳转或移动取决于未初始化的值”问题。 ==23720== Conditional jump
我正在尝试用 C 语言编写自己的 shell。下面的代码适用于没有管道的命令,但不适用于其他情况。 使用 --trace-children=yes 和 --track-origins=yes 运行 v
如何在 valgrind 的输出中抑制这个错误? ==16727== 1 errors in context 2 of 18: ==16727== Conditional jump or move d
我一直在使用 Valgrind 来查找我的代码中的内存泄漏,虽然没有发现内存泄漏,但报告了一些错误,所有这些错误都源于单个函数/类方法: ==17043== ERROR SUMMARY: 10100
该代码将编译并运行,并创建预期的输出,除非运行valgrind时才会出现这些内存泄漏。以下代码在Visual Studio上运行,不会出现任何警告或错误。 所以我的问题是,此内存泄漏发生在哪里?我是C
我正在为学校用 C 语言编写一个简约的 shell。它工作正常,但使用 Valgrind 我收到此错误,我无法弄清楚我做错了什么。我在程序开始时得到它: ==9396== Conditional ju
Valgrind 告诉我两个我无法解决的错误。我在以下函数 unplug_set 中收到“条件跳转或移动取决于未初始化的值”错误消息。是因为 NULL 检查吗?该函数应该从双链表中拔出元素。 void
这是我在第一节编程基础课后遇到的问题之一 gets() 工作正常(我认为),但“cin”拒绝工作 int main(void) { char *s1, *s2; puts("Enter
当我将我的项目与库的静态版本链接时,VALGRIND 开始报告错误编号“条件跳转或移动取决于未初始化的值”错误。问题是项目本身除了空的主函数外什么都没有,所以肯定是库的问题。 库的共享二进制文件和静态
我正在尝试编写一个将新结构添加到链表中的函数。无论我做什么,Valgrind 都会不断给我这个错误。这是代码: /* Stores a new address record to the linked
这是一些 Valgrind 日志的一部分: ==1652== Conditional jump or move depends on uninitialised value(s)==1652==
我在 valgrind 中遇到错误,不知道哪里出了问题。错误是:valgrind 输出: ==1112== Conditional jump or move depends on uninitiali
我是一名优秀的程序员,十分优秀!