fread() causes Valgrind error: "Conditional jump or move depends on uninitialised value(s)"
fread() causes Valgrind error: "Conditional jump or move depends on uninitialised value(s)"
问题:
正在加载数据,但是当尝试从节点 valgrind 检索存储的 text_ 时抛出 "conditional jump"。 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==
解决方案
添加空终止符可修复此错误。
最初的假设是,它已经被 null 终止,这是因为 null 终止符 *text[size_text] = '\0'; 的错误放置。 -> 抛出错误
(*文本)[size_text] = '\0'; -> 修复错误
在fread()
中没有发生错误。它发生在 __GI_strlen
。这意味着该函数的逻辑所依赖的变量未初始化或未完全初始化。
因为您知道 *strlen
应该做什么(计算字符数,C 字符串中终止的 [=13=]
除外),您可以推断出问题所在:您有 malloc()
'ed 一个特定大小的缓冲区,但是包含 [=13=]
终止符的字符串没有完全占据它。所以缓冲区中有尾随的 space 被单元化,因此出现错误。
因此最好检查 return 值 fread()
以确认读取了多少字节。不能保证读取尽可能多的元素(在您的情况下为字节):它可能 return 您出错,或者读取任意数量的元素 最多 您指定的限制。
在您的缓冲区中显式放置空终止符将是另一个好主意! (你错过了。)
问题:
正在加载数据,但是当尝试从节点 valgrind 检索存储的 text_ 时抛出 "conditional jump"。 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==
解决方案
添加空终止符可修复此错误。 最初的假设是,它已经被 null 终止,这是因为 null 终止符 *text[size_text] = '\0'; 的错误放置。 -> 抛出错误 (*文本)[size_text] = '\0'; -> 修复错误
在fread()
中没有发生错误。它发生在 __GI_strlen
。这意味着该函数的逻辑所依赖的变量未初始化或未完全初始化。
因为您知道 *strlen
应该做什么(计算字符数,C 字符串中终止的 [=13=]
除外),您可以推断出问题所在:您有 malloc()
'ed 一个特定大小的缓冲区,但是包含 [=13=]
终止符的字符串没有完全占据它。所以缓冲区中有尾随的 space 被单元化,因此出现错误。
因此最好检查 return 值 fread()
以确认读取了多少字节。不能保证读取尽可能多的元素(在您的情况下为字节):它可能 return 您出错,或者读取任意数量的元素 最多 您指定的限制。
在您的缓冲区中显式放置空终止符将是另一个好主意! (你错过了。)