运行malloc后内存损坏
我正在编写一个pet项目(一种类似于C语言中的单线程Lisp的语言解释器),我遇到了以下问题:在运行运行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
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()
等使用的内部结构。