编译时Interposition失效:mymalloc函数无限递归警告问题求助
解决编译时无限递归警告(Winfinite-recursion)的问题
你的问题根源在于编译时插桩的宏替换逻辑导致了递归调用:当mymalloc.c包含malloc.h后,头文件里的#define malloc(size) mymalloc(size)会将mymalloc函数内部的malloc(size)直接替换为mymalloc(size),形成无限递归,触发编译器的-Winfinite-recursion警告。
下面是最直接的修复方案:
修复代码:绕过宏替换调用原生系统函数
修改mymalloc.c,在调用原生malloc和free前,先取消宏定义,让编译器识别到这是系统原生函数而非被替换的包装函数:
#ifdef COMPILETIME #include <stdio.h> #include "malloc.h" // 取消malloc和free的宏定义,确保后续调用的是系统原生函数 #undef malloc #undef free /* malloc wrapper function */ void *mymalloc(size_t size) { void *ptr = malloc(size); // 此时调用的是libc原生malloc printf("malloc(%d)=%p\n", (int)size, ptr); return ptr; } /* free wrapper function */ void myfree(void *ptr) { free(ptr); // 此时调用的是libc原生free printf("free(%p)\n", ptr); } #endif
验证修复
重新执行make intc编译,之前的无限递归警告会消失。运行./intc会得到预期的输出:
malloc(32)=0xXXXXXX free(0xXXXXXX)
原理说明
通过#undef指令,我们临时取消了头文件中对malloc和free的宏替换,让mymalloc和myfree内部的调用直接指向libc库中的原生内存管理函数,避免了自我递归的问题。这种方式完全适配你当前的编译时插桩方案,不需要修改Makefile或其他文件结构。
内容的提问来源于stack exchange,提问作者Thành Phạm
相关产品推荐
相关产品推荐

