【发布时间】:2021-05-20 11:43:16
【问题描述】:
运行我的程序时,我收到以下错误:
malloc.c:2385: sysmalloc: 断言`(old_top == initial_top (av) && 旧尺寸 == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' 失败。
完整的代码很大,但我设法在复制中找到了一些有趣的东西,我不明白为什么会这样。非常感谢任何帮助和/或解释。
这是没有失败时的代码的 sn-p:
static void adjacent_list_get(struct elem **elem_list,
struct elem *element,
uint32_t *size) {
struct elem **t_elem_list;
t_elem_list = calloc((size_t) 1, sizeof(*t_elem_list));
if (!elem_list) {
...
这是失败时的代码的sn-p:
static void adjacent_list_get(struct elem **elem_list,
struct elem *element,
uint32_t *size) {
struct elem **t_elem_list;
if (!elem_list) {
t_elem_list = calloc((size_t) 1, sizeof(*t_elem_list));
...
在执行过程中,elem_list 是NULL,所以if 语句为真,它进入了那个块;但随后它因上述错误而失败。
我无法理解同一行,同一 calloc 如何在同一函数中失败,具体取决于它是在 if 块内部还是外部。我在这里遗漏了一些东西,我在互联网上找不到任何解释。
【问题讨论】:
-
您可能正在破坏一些由内存管理器用于记账的堆内存,这很可能是由于缓冲区溢出。仅通过查看您提供的代码的 sn-ps 就很难跟踪。我建议使用 ASAN 重建您的程序,这可能会在损坏发生时检测到。
-
通过 valgrind 运行您的代码。如果你对内存管理不善,它会告诉你在哪里。
-
好的,如果我理解正确,这只是其他地方问题的征兆?
-
不一定,但很有可能。
-
好的,这是一个典型的未定义行为错误。您在某处有可疑的代码,可能会导致堆损坏。无法复制。