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

GCC-11开启-fsanitize=address检测到内存泄漏,求定位排查建议

内存泄漏问题排查结果

以下是代码中明确存在的泄漏点:

  • 函数开头分配的a_line未释放:通过dup_line()分配的a_line在case ';'、case '}'两个提前返回分支中都没有执行释放逻辑,代码末尾的FREE(a_line)位于所有分支跳转逻辑之后,永远不会被执行,同时该行还缺少分号,即使能到达也会编译报错。
  • <标签分支的d_line泄漏:匹配$<标签逻辑时,如果进入调用dollar_error的分支,没有提前释放已分配的d_line,除非dollar_error内部会处理入参内存的释放,否则每次触发错误都会泄漏一块内存。
  • 字符串处理分支的s_line泄漏:单/双引号处理逻辑中,如果触发unterminated_string错误,会直接退出当前逻辑,没有释放已分配的s_line。
  • 注释处理分支的c_line泄漏:/* */块注释处理逻辑中,如果触发unterminated_comment错误,同样没有释放已分配的c_line就直接退出。
  • 未结束操作报错分支泄漏:case '\n'分支中如果调用unterminated_action,也没有提前释放已分配的a_line。
可尝试的通用排查方法
  • 梳理所有dup_line调用的执行路径:ASAN已经明确泄漏的内存全部来自dup_line分配,逐个核对每一处dup_line的调用,确保所有可能的执行路径(包括正常返回、错误抛出、分支跳转)都有对应的FREE调用,不要只检查正常执行的逻辑。
  • 内存分配释放加日志埋点:给dup_line和FREE宏加调试日志,分配时打印返回的内存地址、调用函数、行号,释放时打印对应的地址,程序退出后对比未释放的地址对应的分配位置,可快速定位泄漏点。
  • 自动内存释放优化:如果编译环境支持GCC扩展,可以给指针变量加__attribute__((cleanup(FREE)))属性,变量离开作用域时会自动调用释放函数,避免手动漏写释放逻辑。
简易修复示例

以case ';'分支为例,补充释放逻辑即可:

case ';':
    if (depth > 0) goto loop;
    fprintf(f, "\nbreak;\n");
    FREE(a_line); // 补充释放
    return;

其余提前返回、错误抛出分支也按照相同逻辑,在退出前释放对应已分配的临时内存即可。

内容的提问来源于stack exchange,提问作者afernandezody

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:27:00