C语言 在自己的 malloc 函数中调用 printf 会导致分段错误



我想用Linux GCC在纯C中"覆盖"malloc,用于内存检查。请注意,malloc()是一个弱符号,在纯 C 中这样做是可以的,即制作一个强的malloc()符号。

但是我只是发现如果我在我的malloc()实现中调用printf()它会崩溃,如果删除,它不会崩溃。

要重现:

#include <stdio.h>
extern void *__libc_malloc(size_t size);
static int cnt = 0;
void* malloc(size_t size) {
printf("--- calling customized mallocn");
cnt += 1;
if(cnt > 1) return NULL;
return __libc_malloc(size);
}
static void leak_test1() {
int* a = malloc(sizeof(int)*5);
a[0] = 3;
}
int main(){
leak_test1();
printf("cnt=%dn", cnt);
return 0;
}

这是否意味着"调用 printf 在我自己的 malloc(( 中无效"?深层原因是什么?(如果我错了,请纠正我(

printf调用malloc可能会为stdout分配缓冲区,因此会得到无限递归。

您可以通过在stderr未缓冲时调用fprintf(stderr, ...)来解决此问题。

最新更新