已关闭
【缺陷报告】内存泄漏 - 文件test_aclnn_nsa_selected_attention.cpp - 函数main - 行号215 #4795
zhangjunkai9创建于  15 天前关闭于  1 天前
zhangjunkai9
15 天前 创建

缺陷信息

缺陷类型memoryLeak (内存泄漏)
函数main
文件attention/nsa_selected_attention/examples/test_aclnn_nsa_selected_attention.cpp
行号215
置信度90%
分析模型maas-glm-5.1-zhipu

缺陷描述

在 main 函数中,第215-216行通过 aclCreateIntArray 创建了 actualSeqQLenOptional 和 actualSeqKvLenOptional 两个 aclIntArray 对象(动态分配)。但 FreeResource 函数(第104-159行)仅释放6个 aclTensor、6个 device 地址、workspace、stream 和 context,未处理这两个 aclIntArray 对象。函数末尾(第321行)和所有错误路径调用 FreeResource 时均未调用 aclDestroyIntArray 释放这两个对象,导致内存泄漏。

事实核查

核查1(模式成立):第215-216行通过 aclCreateIntArray 创建 actualSeqQLenOptional 和 actualSeqKvLenOptional 两个 aclIntArray 对象;

第281行将两者传入 aclnnNsaSelectedAttentionGetWorkspaceSize 使用;

FreeResource 函数(第104-159行)仅释放6个 aclTensor、6个 device 地址、workspace、stream 和 context,不包含任何 aclDestroyIntArray 调用;

第321行成功路径调用 FreeResource 后第325行 return 0,两个 aclIntArray 对象泄漏,模式成立。

核查2(防护无效):FreeResource 及所有调用点均无 aclDestroyIntArray 调用。

核查3(函数可达):main 为入口函数,depth 0,可达。

核查4(触发可满足):泄漏发生在成功路径即正常执行路径,程序正常执行完毕后两个 aclIntArray 对象泄漏,触发条件满足。

模式成立+无防护+可达+触发可满足,确认为真实缺陷。

数据流证据

Source(问题源头)

attention/nsa_selected_attention/examples/test_aclnn_nsa_selected_attention.cpp:215 行 aclIntArray *actualSeqQLenOptional = aclCreateIntArray(actualSeqQLenVec.data(), actualSeqQLenVec.size()) 动态创建 aclIntArray 对象

Sink(问题爆发点)

attention/nsa_selected_attention/examples/test_aclnn_nsa_selected_attention.cpp:321 行 FreeResource(...) 调用时不释放 actualSeqQLenOptional 和 actualSeqKvLenOptional,函数第325行 return 0 时两者泄漏

传播路径:

# 文件 行号 说明
1 attention/nsa_selected_attention/examples/test_aclnn_nsa_selected_attention.cpp 215 aclIntArray *actualSeqQLenOptional = aclCreateIntArray(actualSeqQLenVec.data(), actualSeqQLenVec.size()) 动态分配 aclIntArray 对象
2 attention/nsa_selected_attention/examples/test_aclnn_nsa_selected_attention.cpp 216 aclIntArray *actualSeqKvLenOptional = aclCreateIntArray(actualSeqKvLenVec.data(), actualSeqKvLenVec.size()) 动态分配第二个 aclIntArray 对象
3 attention/nsa_selected_attention/examples/test_aclnn_nsa_selected_attention.cpp 281 aclnnNsaSelectedAttentionGetWorkspaceSize(..., actualSeqQLenOptional, actualSeqKvLenOptional, ...) 将两个 aclIntArray 作为参数传入算子 API
4 attention/nsa_selected_attention/examples/test_aclnn_nsa_selected_attention.cpp 104-159 FreeResource 函数定义:仅释放 aclTensor、device 地址、workspace、stream、context,不包含 aclDestroyIntArray 调用
5 attention/nsa_selected_attention/examples/test_aclnn_nsa_selected_attention.cpp 321 FreeResource(...) 在函数末尾调用,actualSeqQLenOptional 和 actualSeqKvLenOptional 未被释放
6 attention/nsa_selected_attention/examples/test_aclnn_nsa_selected_attention.cpp 325 return 0 函数返回,两个 aclIntArray 对象(第215-216行创建)泄漏

调用链

可达调用链1 起点:(entry functions) → 终点:main 深度:0

# 文件 函数 函数起始行 调用点行
1 attention/attention_update/examples/test_aclnn_attention_update.cpp main 77

修复建议

// 在第321行 FreeResource 调用之前释放 aclIntArray 对象
// 6. 释放aclTensor和aclScalar,需要根据具体API的接口定义修改; 释放device资源
aclDestroyIntArray(actualSeqQLenOptional);
aclDestroyIntArray(actualSeqKvLenOptional);
FreeResource(q, k, v, attentionOut, softmaxMax, softmaxSum, qDeviceAddr, kDeviceAddr, vDeviceAddr,
    attentionOutDeviceAddr, softmaxMaxDeviceAddr, softmaxSumDeviceAddr, workspaceSize, workspaceAddr,
    deviceId, &context, &stream);
likedislike
weihao18成员
14 天前 评论:

你好,建议汇总到具体算子进行集中处理

likedislike
游震成员
12 天前 评论:

/assign @yu-xinjie62

likedislike
CANN-robotCANN-robot成员
12 天前 将 yu-xinjie62 设为负责人
memorecoolmemorecool成员
5 天前 将 hz36amy_00 设为负责人
yf_zhouyf_zhou成员
4 天前 关联了pull request:fix: release NSA example int arrays
CANN-robotCANN-robot成员
1 天前 关闭了 issue
CANN-robotCANN-robot成员
1 天前 添加了label:resolved