已关闭
【缺陷报告】内存泄漏 - 文件fallback.h - 函数EXEC_OPAPI_CMD - 行号497 #4796
zhangjunkai9创建于  14 天前关闭于  7 天前
zhangjunkai9
14 天前 创建

缺陷信息

缺陷类型memoryLeak (内存泄漏)
函数EXEC_OPAPI_CMD
文件common/include/fallback/fallback.h
行号497
置信度90%
分析模型maas-glm-5.1-zhipu

缺陷描述

EXEC_OPAPI_CMD 宏中,第491行 ConvertTypes 创建 converted_params(std::tuple 类型,内含动态分配的 aclTensor*/aclIntArray* 等对象)。第493行调用 GetWorkspaceSize 后,若 workspace_status != 0,第497行 break 跳出 do-while 循环,跳过了第509-522行 acl_call lambda 中的 ReleaseConvertTypes(converted_params) 调用。converted_params 是普通 std::tuple(非 ConvertedParams 类,后者有析构函数自动释放),其析构仅销毁指针值不释放堆对象,导致 converted_params 中的动态分配对象泄漏。该宏在 33+ 个 fallback 实现文件中使用,entry_callchain 为空是因为静态分析无法追踪宏展开,并非不可达。对比 fallback_2stages.h 的 EXEC_OPAPI_PREPARE_CMD 使用 SetOpApiParamsWithDefaultDeleter 自动管理生命周期,确认 fallback.h 版本存在缺陷。

事实核查

核查1-4均成立。

(1) 模式核查:第491行 ConvertTypes 返回 std::tuple(非 ConvertedParams 类),内含 ConvertType 动态分配的 aclTensor*/aclIntArray* 等堆对象(如第202行 ConvertType 调用 aclCreateTensor、第165行调用 aclCreateIntArray)。

第494行 if(workspace_status!=0) 第497行 break 跳出 do-while,跳过第514行 acl_call lambda 内的 ReleaseConvertTypes(converted_params)。

std::tuple 析构仅销毁指针值不释放堆对象,内存泄漏模式成立。

对比 fallback_2stages.h 的 EXEC_OPAPI_PREPARE_CMD 使用 SetOpApiParamsWithDefaultDeleter 自动管理生命周期,确认 fallback.h 版本存在缺陷。

(2) 防护核查:ReleaseConvertTypes 仅在 acl_call lambda 内调用(第514行),break 路径不执行该 lambda,无有效防护覆盖错误路径。

(3) 可达性核查:EXEC_OPAPI_CMD 宏在 33 个 fallback 实现文件中使用(如 fallback_prompt_flash_attention.cpp 第121行 PromptHostExecuteFunc 中调用),函数可达。

(4) 触发核查:workspace_status!=0 即 GetWorkspaceSize 返回错误是运行时输入校验失败的正常错误路径,调用方传入用户提供的 tensor(如 query/key/value),当输入不合法时 GetWorkspaceSize 返回非零值,触发可满足。

数据流证据

Source(问题源头)

common/include/fallback/fallback.h:491 行 auto converted_params = ConvertTypes(__VA_ARGS__, workspace_size_addr, executor_addr) 创建 tuple,内含 ConvertType 函数动态分配的 aclTensor*/aclIntArray* 等堆对象

Sink(问题爆发点)

common/include/fallback/fallback.h:497 行 break 跳出 do-while 循环,跳过第514行 ReleaseConvertTypes(converted_params) 调用,converted_params 中的堆对象泄漏

传播路径:

# 文件 行号 说明
1 common/include/fallback/fallback.h 491 auto converted_params = ConvertTypes(__VA_ARGS__, workspace_size_addr, executor_addr) ConvertTypes 返回 std::tuple,内含通过 aclCreateTensor/aclCreateIntArray 等动态分配的堆对象(source)
2 common/include/fallback/fallback.h 493 auto workspace_status = call(getWorkspaceSizeFunc, converted_params) 调用 GetWorkspaceSize 函数,返回值 workspace_status
3 common/include/fallback/fallback.h 494 if (workspace_status != 0) 检查返回值,若非0则进入错误处理分支
4 common/include/fallback/fallback.h 497 break 跳出 do-while 循环,跳过第509-524行代码(包含 acl_call lambda 定义和调用)
5 common/include/fallback/fallback.h 514 ReleaseConvertTypes(converted_params) 仅在 acl_call lambda 内部调用,break 路径不执行此 lambda,堆对象无人释放(sink)

修复建议

            if (workspace_status != 0) {
                OP_LOGE("aclnnfallback", "call %s failed:", #aclnn_api);
                ReleaseConvertTypes(converted_params);
                ret = GRAPH_FAILED;
                break;
            }
likedislike
游震成员
11 天前 评论:

/assign @weihao18

likedislike
CANN-robotCANN-robot成员
11 天前 将 weihao18 设为负责人
Wweihao18成员
11 天前 关联了pull request:fix: 修复 EXEC_OPAPI_CMD 宏错误路径 break 跳过 ReleaseConvertTypes 导致的内存泄漏
CANN-robotCANN-robot成员
7 天前 关闭了 issue
CANN-robotCANN-robot成员
7 天前 添加了label:resolved