gpt4 book ai didi

c - Valgrind 错误、大小读取无效和条件跳转或移动取决于未初始化的值

转载 作者:太空宇宙 更新时间:2023-11-03 23:47:51 27 4
gpt4 key购买 nike

我遇到了这两个错误,在搜索了很长时间后可能需要一些帮助才能找到解决方案:

==4902== 1 errors in context 1 of 2:
==4902== Invalid read of size 1
==4902== at 0x4010A0: getData (main.c:321)
==4902== by 0x402527: main (main.c:783)
==4902== Address 0x52007af is 1 bytes before a block of size 2,152 alloc'd
==4902== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4902== by 0x400FF1: getData (main.c:309)
==4902== by 0x402527: main (main.c:783)
==4902==
==4902==
==4902== 1 errors in context 2 of 2:
==4902== Conditional jump or move depends on uninitialised value(s)
==4902== at 0x4C2E0E9: strlen (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4902== by 0x40107A: getData (main.c:319)
==4902== by 0x402527: main (main.c:783)
==4902== Uninitialised value was created by a heap allocation
==4902== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4902== by 0x400FF1: getData (main.c:309)
==4902== by 0x402527: main (main.c:783)
  char** buffer = malloc(file_size * sizeof(char**));
if(buffer == NULL)
{
status = EXITCODE_4;
return status;
}

int buffer_counter = 0;
int buffer_length = 0;

while(!feof(datafile))
{
buffer[buffer_counter] = malloc(file_size * sizeof(char*));
if(buffer[buffer_counter] == NULL)
{
status = EXITCODE_4;
free2D(buffer, buffer_counter);
return status;
}

fgets(buffer[buffer_counter], file_size, datafile);

buffer_length = strlen(buffer[buffer_counter]) - 1;

if((buffer[buffer_counter][buffer_length]) == NEWLINE)
buffer[buffer_counter][buffer_length] = 0;
buffer_counter++;
}

第 309 行是第二个 malloc 发生的地方,321 如果和 319 strlen

我对 valgrind 不是很有经验,所以我不知道如何解决这个问题。感谢我能得到的任何帮助。

最佳答案

改变

while (!feof(datafile))

while (fgets(buffer[buffer_counter], file_size, datafile) != NULL)

因为 while (!feof(datafile)) 会在文件末尾迭代一次,读取 why while (!feof(datafile)) is always wrong .

EOF 标记是在 fgets() 尝试读取文件末尾之后设置的,因此它需要一次额外的迭代才能发生,但是 fgets() 将在文件末尾返回 NULL,因此如果您在 while 循环条件中测试它,您将不会访问未初始化的值。

当然你需要重新考虑程序流程,我建议这样做

char** buffer = malloc(file_size * sizeof(char *));
if (buffer == NULL)
{
status = EXITCODE_4;
return status;
}

int buffer_counter = 0;
int buffer_length = 0;
char line[file_size];

while (fgets(line, file_size, datafile) != NULL)
{
size_t length;

length = strlen(line);
if (line[length - 1] == NEWLINE)
line[--length] = '\0';
buffer[buffer_counter] = malloc(1 + length);
if (buffer[buffer_counter] == NULL)
{
status = EXITCODE_4;
free2D(buffer, buffer_counter);
return status;
}
strcpy(buffer[buffer_counter], line);
buffer_counter++;
}

此外,malloc(file_size * sizeof(char *)) 分配的内存超出您的需要,您需要 malloc(file_size * sizeof(char)),并且sizeof(char) == 1 所以只是 malloc(file_size),无论如何我都修复了它,以便为适合的确切字符串分配空间。

关于c - Valgrind 错误、大小读取无效和条件跳转或移动取决于未初始化的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28445117/

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