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* 等堆对象
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 中的堆对象泄漏
Sink(问题爆发点)
common/include/fallback/fallback.h:497 行 break 跳出 do-while 循环,跳过第514行 ReleaseConvertTypes(converted_params) 调用,converted_params 中的堆对象泄漏
传播路径:
if (workspace_status != 0) { OP_LOGE("aclnnfallback", "call %s failed:", #aclnn_api); ReleaseConvertTypes(converted_params); ret = GRAPH_FAILED; break; }
/assign @weihao18
缺陷信息
缺陷描述
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 版本存在缺陷。
事实核查
数据流证据
传播路径:
修复建议
if (workspace_status != 0) { OP_LOGE("aclnnfallback", "call %s failed:", #aclnn_api); ReleaseConvertTypes(converted_params); ret = GRAPH_FAILED; break; }