运行malloc后内存损坏

运行malloc后内存损坏,c,pointers,memory-corruption,C,Pointers,Memory Corruption,我正在编写一个pet项目(一种类似于C语言中的单线程Lisp的语言解释器),我遇到了以下问题:在运行malloc()时,指针被覆盖。显示所有代码会太长,但如果需要,我可以共享它。我想了解一下如何调试这个问题 错误发生在运行用户定义函数的子例程期间: /* Determine the amount of arguments to the called function */ int argc = ast_len(fn_args) printf("%s:%d %p\n", __FILE__, __L

我正在编写一个pet项目(一种类似于C语言中的单线程Lisp的语言解释器),我遇到了以下问题:在运行
malloc()
时,指针被覆盖。显示所有代码会太长,但如果需要,我可以共享它。我想了解一下如何调试这个问题

错误发生在运行用户定义函数的子例程期间:

/* Determine the amount of arguments to the called function */
int argc = ast_len(fn_args)
printf("%s:%d %p\n", __FILE__, __LINE__, (void*) scope->vars->tail);
/* Allocate the memory to store the array of pointers to each of the arguments */
struct YL_Var** argv = malloc(sizeof(struct YL_Var*)*argc);
printf("%s:%d %p\n", __FILE__, __LINE__, (void*) scope->vars->tail);
您将获得以下输出:

interpreter.c:549 0x5558371c9480
interpreter.c:551 0x411
Segmentation fault (core dumped)
调用
malloc()
时,指针
scope->vars->tail
被覆盖

使用gdb和硬件断点清楚地表明该值在malloc.c中被覆盖

当指针被覆盖时,程序很快就会在gdb内和正常运行时发生故障。然而,在valgrind内部运行时,它不会出现故障,甚至会成功结束。 这是我的问题。你将如何开始调试这个混乱?我是在寻求建议,而不是答案。 我远非C语言专家:)

我想我错了,这当然不是glibc-2.26或gcc 7.2.0中的错误

  • 我在gcc上没有使用
    -Wall-Wextra-Wpedantic
  • valgrind显示了一些未缠绕的内存问题。在做任何其他事情之前先解决它们

    • 感谢大家的评论,我发现了这个问题

      scope->vars
      分配不当(正如一些人所说)。 使用
      valgrind
      时,我发现以下消息:

      ==23054== Invalid write of size 8
      ==23054==    at 0x10A380: varlist_prepend (interpreter.c:277)
      ==23054==    by 0x109548: main (yl.c:39)
      ==23054==  Address 0x5572a98 is 0 bytes after a block of size 8 alloc'd
      ==23054==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
      ==23054==    by 0x10A304: varlist_prepend (interpreter.c:274)
      ==23054==    by 0x109548: main (yl.c:39)
      ==23054==
      
      我的代码如下所示:

      struct YL_VarList* vars = malloc(sizeof(vars));
      
      如您所见,
      *
      丢失。 这是正确的版本:

      struct YL_VarList* vars = malloc(sizeof(*vars));
      

      sizeof(vars)
      将返回
      struct YL\u VarList*
      的大小,而我想分配
      struct YL\u VarList的大小

      范围指向哪里?
      scope->vars
      指向哪里?你能不能创建一个显示给我们看。顺便说一下,你显示的输出与代码不匹配。如果第一个输出来自第549行,那么在第550行有一条注释,然后在第551行有
      malloc
      调用(输出中的第二行声称它来自该调用)。然后第二个
      printf
      发生在第552行。我们真的需要一个。哦,你可能应该使用例如来帮助你发现记忆问题。你从Valgrind那里得到任何报告吗?还可以尝试gcc清理程序,特别是地址和UB。几乎可以肯定的是,“在运行
      malloc()
      时指针被覆盖”,而是(a)您仍在尝试使用的内存块(例如
      scope->vars->tail
      )已被释放(或未正确分配),或者(b)某些内容已写入已分配块的末尾,并损坏了
      malloc()
      等使用的内部结构。