我正在尝试重现一个问题。我的c代码给出SIGABRT,我追溯到这行号:3174https://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");
我的理解是,当我调用callloc函数时,当我调用realloc函数并尝试增加内存区域时,堆由于某种原因不可用,给出SIGABRT
我的另一个问题是,我如何将堆面积限制到一些字节,比如10个字节来复制问题。在stackoverflow中提到了RSLIMIT和srlimit,但没有提到示例代码。能否提供堆大小为10字节的示例代码?
我如何将堆面积限制在一些字节内比如说,10个字节
能否提供堆大小为10字节的示例代码?
从如何限制linux中c代码的堆大小,您可以这样做:
您可以使用(在您的程序中)setrlimit(2),可能使用RLIMIT_AS(如Ouah的回答所引用的)。
#include <sys/resource.h>
int main() {
setrlimit(RLIMIT_AS, &(struct rlimit){10,10});
}
更好的是,让您的shell执行此操作。对于bash,它是无限的内置。
$ ulimit -v 10
$ ./your_program.out
复制问题
很可能,限制堆大小将导致与堆大小限制相关的不同问题。最有可能的是,它是不相关的,并且不会帮助您调试问题。相反,我建议研究地址消毒剂和valgrind。