You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 07:57:29