Syscall param read(buf)指向不可寻址的字节

时间:2015-02-05 03:04:38

标签: c linux

我试图使用Valgrind调试我的代码,但是我确实遇到了一些有读取功能的问题。

这是Valgrind日志:

==4333== Syscall param read(buf) points to unaddressable byte(s)
==4333==     at 0x4F0C600: __read_nocancel (in /lib64/libc-2.18.so)
==4333==     by 0x400AB7: my_read (get_next_line.c:132)
==4333==     by 0x400B6C: get_next_line (tmp.c:25)
==4333==     by 0x400B27: main (get_next_line.c:146)
==4333== Address 0x401000 is not stack'd, malloc'd or (recently) free'd
==4333==
==4333==
==4333== HEAP SUMMARY:
==4333==    in use at exit : 4,106bytes in 1 blocks
==4333==  total heap usage: 1 allocs, 0 frees, 4,106 bytes allocated
==4333==
==4333== 4,106 bytes in 1 blocks are definitely lost in loss record 1 of 1
==4333==    at 0x4C277AB: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==4333==    by 0x400A59: my_read (get_next_line.c:129)
==4333==    by 0x400B6C: get_next_line (tmp.c:25)
==4333==    by 0x400B27: main (get_next_line.c:146)
==4333==
==4333== LEAK SUMMARY:
==4333==    definitely lost: 4,106 bytes in 1 blocks

以下是代码:

int    my_read(int fd)
{
  char *str;
  void *buff;
  int   x;

  str = NULL;
  if ((buff malloc(BUFFER_SIZE + 10)) == NULL)
     return (NULL);
  buff = NULL;
  while ((x = read(fd, buff, BUFFER_SIZE)) > 0) //LINE 132
     str = (str == NULL) ? my_strdup(buff) : my_strcat(buff, str);
  return (str);
}

BUFFER_SIZE定义为4096。

我理解错误,但我不知道如何进行此操作。 如果你们能帮助我解决这个问题,那就太棒了。 TY。

1 个答案:

答案 0 :(得分:2)

问题是

buff = NULL;

语句。在为buffer分配空间后,您将忘记并使用NULL覆盖该空格,然后在致电read()时使用该空格。摆脱那种说法。

在从函数返回之前,您还需要free(buff);。否则,每次拨打my_read()时,您都会泄漏内存。

因为你返回一个指针,所以应该声明该函数:

char * my_read(int fd)