【问题标题】:Syscall param read(buf) points to unaddressable byte(s)系统调用参数 read(buf) 指向不可寻址字节
【发布时间】:2015-02-05 03:04:38
【问题描述】:

我正在尝试使用 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 处定义。

我理解错误,但我不知道如何携带。 如果你们能帮我解决这个问题,那就太棒了。泰。

【问题讨论】:

标签: c linux


【解决方案1】:

问题是

buff = NULL;

声明。在为buffer 分配空间后,您会忘记它并用NULL 覆盖它,然后在调用read() 时使用它。摆脱这种说法。

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

既然你返回一个指针,函数应该被声明:

char * my_read(int fd)

【讨论】:

    猜你喜欢
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    相关资源
    最近更新 更多