已关闭
【缺陷报告】内存泄漏 - 文件test_geir_indexer_quant_cache.cpp - 函数main - 行号246 #4792
zhangjunkai9创建于 8月31日关闭于 9月4日
8月31日 修改了issue 的描述
游震
9月3日 评论:
9月3日 评论:
/assign @luwei_1104


CANN-robot
9月3日 评论:
9月3日 评论:
CANN-robot
9月3日 评论:
9月3日 评论:
9月4日 关联了pull request:fix(indexer_quant_cache): 修复GEIR内存泄漏并补充数值golden
9月4日 关闭了 issue
9月4日 添加了label:resolved
缺陷信息
缺陷描述
在 main 函数中,第246行通过 'ge::Session *session = new Session(build_options)' 在堆上分配了 Session 对象。在 RunGraph 失败路径(第268-273行)有 'delete session' 释放,但在成功路径上(第274-313行),函数执行到第313行 'return SUCCESS' 时从未调用 delete session,导致 Session 对象泄漏。第307行调用的 GEFinalize() 负责终结 GE 引擎,但不负责释放用户 new 出的 Session 对象——失败路径显式 delete 证明了开发者意图需手动释放,成功路径遗漏了该释放。
同类问题
{ "file": "attention/scatter_pa_kv_cache_with_k_scale/examples/test_geir_scatter_pa_kv_cache_with_k_scale.cpp", "func": "main", "line": 229, "description": "在 main 函数中,第229行通过 new Session(build_options) 在堆上分配了 Session 对象。第251行 RunGraph 失败的错误路径中有 delete session(第253行),但成功路径从第257行继续执行到第298行 return SUCCESS,期间未 delete session。GEFinalize() 是全局清理函数,不负责释放用户 new 创建的 Session 对象,导致成功路径上 session 堆内存泄漏。" }, { "file": "attention/stem_oam_prep_varlen_q/examples/test_geir_stem_oam_prep_varlen_q.cpp", "func": "main", "line": 272, "description": "在 main 函数中,第272行通过 new Session(build_options) 在堆上分配了 Session 对象。第294行 RunGraph 失败的错误路径中有 delete session(第296行),但成功路径从第300行继续执行到第341行 return SUCCESS,期间未 delete session。GEFinalize() 是全局清理函数,不负责释放用户 new 创建的 Session 对象,导致成功路径上 session 堆内存泄漏。" }, { "file": "ffn/ffn_worker_batching/examples/test_geir_ffn_worker_batching.cpp", "func": "main", "line": 228, "description": "在 main 函数中,第228行通过 new Session(build_options) 在堆上分配了 Session 对象。第249行 RunGraph 失败的错误路径中有 delete session(第252行),但成功路径从第256行继续执行到第297行 return SUCCESS,期间未 delete session。GEFinalize() 是全局清理函数,不负责释放用户 new 创建的 Session 对象,导致成功路径上 session 堆内存泄漏。" }, { "file": "ffn/swin_attention_ffn/examples/test_geir_swin_attention_ffn.cpp", "func": "main", "line": 314, "description": "在 main 函数中,第254行通过 new Session(build_options) 在堆上分配了 Session 对象。第275行 RunGraph 失败的错误路径中有 delete session(第278行),但成功路径从第282行继续执行到第320行 return SUCCESS,期间未 delete session。GEFinalize() 是全局清理函数,不负责释放用户 new 创建的 Session 对象,导致成功路径上 session 堆内存泄漏。" }, { "file": "moe/moe_re_routing/examples/test_geir_moe_re_routing.cpp", "func": "main", "line": 253, "description": "函数 main 在第253行通过 new Session(build_options) 创建堆对象 session。在第274行 RunGraph 失败的分支(第277行)执行了 delete session,但在 RunGraph 成功的正常执行路径(第281行之后到第322行 return SUCCESS)中,session 从未被 delete 释放。函数在成功路径上直接返回 SUCCESS,导致 session 对象的堆内存泄漏。GEFinalize() 不会释放由 new Session 分配的堆内存。" }, { "file": "posembedding/rope_quant_kvcache/examples/test_geir_rope_quant_kvcache.cpp", "func": "main", "line": 261, "description": "函数 main 在第261行通过 new Session(build_options) 分配堆内存 session。在错误路径上(RunGraph 失败,第285行)有 delete session 释放,但在成功执行路径上(第289行之后至第329行 return SUCCESS),session 从未被 delete 释放。对比同仓其他测试文件(如 test_geir_inplace_partial_rotary_mul_grad.cpp 第321行)在成功路径上均有 delete session,本文件遗漏了成功路径的释放。main 为程序入口函数(depth=0),必然可达,泄漏可被实际触发。" }事实核查
数据流证据
传播路径:
调用链
可达调用链1 起点:
(entry functions)→ 终点:main深度:0修复建议
// 在第307行 GEFinalize 之前、成功路径上释放 session printf("%s - INFO - [XIR]: Start to finalize ir graph session\n", GetTime().c_str()); delete session; // 释放成功路径上的 session 对象 ret = ge::GEFinalize(); if (ret != SUCCESS) { printf("%s - INFO - [XIR]: Finalize ir graph session failed\n", GetTime().c_str()); return FAILED; } printf("%s - INFO - [XIR]: Finalize ir graph session success\n", GetTime().c_str()); return SUCCESS;