我想用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, ...)
来解决此问题。