首页 > 解决方案 > 由于堆大小有限,realloc 函数给出了 SIGABRT

问题描述

我正在尝试重现问题。我的 c 代码给 SIGABRT ,我将其追溯到此行号:3174 https://elixir.bootlin.com/glibc/glibc-2.27/source/malloc/malloc.c

  /* Little security check which won't hurt performance: the allocator
     never wrapps around at the end of the address space.  Therefore
     we can exclude some size values which might appear here by
     accident or by "design" from some intruder.  We need to bypass
     this check for dumped fake mmap chunks from the old main arena
     because the new malloc may provide additional alignment.  */
  if ((__builtin_expect ((uintptr_t) oldp > (uintptr_t) -oldsize, 0)
       || __builtin_expect (misaligned_chunk (oldp), 0))
      && !DUMPED_MAIN_ARENA_CHUNK (oldp))
      malloc_printerr ("realloc(): invalid pointer");

我的理解是,当我调用 calloc 函数时,当我调用 realloc 函数并尝试增加内存区域时,内存被分配,由于某种原因,堆不可用给 SIGABRT

我的另一个问题是,如何将堆区域限制为一些字节,比如 10 个字节来复制问题。在 stackoverflow 中提到了 RSLIMIT 和 srlimit,但没有提到示例代码。您能否提供堆大小为 10 字节的示例代码?

标签: linuxlinux-kernelmallocheap-memory

解决方案


如何将堆区域限制为某些字节,例如 10 个字节

您能否提供堆大小为 10 字节的示例代码?

How to limit heap size for ac code in linux 中,您可以执行以下操作:

您可以使用(在您的程序中)setrlimit(2),可能与 RLIMIT_AS 一起使用(如 Ouah 的回答所引用)。

#include <sys/resource.h>
int main() {
    setrlimit(RLIMIT_AS, &(struct rlimit){10,10});
}

更好的是,让你的外壳来做。对于 bash,它是 ulimit 内置的。

$ ulimit -v 10
$ ./your_program.out

复制问题

最有可能的是,限制堆大小将导致与堆大小限制相关的不同问题。很可能它是不相关的,并且不会帮助您调试问题。相反,我建议研究地址 sanitizer 和 valgrind。


推荐阅读