gpt4 book ai didi

c - fread() 导致 Valgrind 错误 : "Conditional jump or move depends on uninitialised value(s)"

转载 作者:太空宇宙 更新时间:2023-11-04 07:59:35 26 4
gpt4 key购买 nike

问题:

在工作中加载数据,但是当尝试从节点 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com