文件最后提交记录最后更新时间
补充动态图fallback符号索引逻辑 Co-authored-by: gitcode_lijd<lijiandong20@huawei.com> # message auto-generated for no-merge-commit merge: !6094 merge fix into master 补充动态图fallback符号索引逻辑 Created-by: gitcode_lijd Commit-by: gitcode_lijd Merged-by: cann-robot Description: ## 描述 补充GE动态图 fallback回调时寻找符号逻辑,之前遗漏了libopapi_transformer.so ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/2760 # 代码检视报告 **项目名称**:ops-transformer PR#6094 检视报告 **检视模块**:common/include/fallback/fallback.h(完整绝对路径:/mnt/workspace/gitCode/gitcode_lijd/ops-transformer/common/include/fallback/fallback.h) **检视人**:Turing Team (AI Code Review) **检视日期**:2026-05-29 **检视模式**:PR 检视(变更范围仅覆盖 diff 部分) **代码侧别**:Host 侧(Tiling 侧) ## 🔍 检视概览 | 统计项 | 数值 | | ---- | ---- | | 检视条款总数 | 11 条 | | 通过条款 | 8 条 | | 需关注条款 | 2 条 | | 发现问题条款 | 0 条 | | 预存在问题(非PR引入) | 2 条 | **核心结论**:本次 PR 变更(补充动态图 fallback 符号索引逻辑)代码质量良好,新增代码严格遵循已有代码模式,空指针保护充分,LOG API 参数匹配正确。存在 2 处"需关注"级别问题(均为预存在模式的延续,非本次 PR 引入):dlopen 资源未显式释放、搜索链路无 dlclose 调用。此外发现 1 处预存在 bug(GetAclnnArrdByApiName 函数中 static 变量在循环内误用导致只搜索第一个库),建议单独修复。 ## 🔶 需关注问题详情 ### 问题ID:ISSUE-001 | 严重级别:MEDIUM(需关注) #### 🔬 假设检验过程 **代码段**:GetOpApiFuncAddr() 函数 — dlopen 资源管理 **假设**:H0: 该代码段的内存/资源管理是安全的 | 证据序号 | 证据类型 | 规范ID | 证据描述 | 分值增量 | 累计自信值 | |---------|---------|--------|---------|---------|-----------| | 1 | 规范违反 | 1.2/5.2 | dlopen 获取的 3 个 handler(custOpApi、opApi、transformerOpApi)均未调用 dlclose 释放 | +40% | 40% | | 2 | 上下文防御缺失 | 1.2/5.2 | 全文件无任何 dlclose 调用,新增代码同样无释放逻辑 | +30% | 70% | **结论**:自信值 **70%** > 60%,**推翻原假设H0**,该代码段存在资源管理风险。 --- **关联规范条款**:SEC-1.2(保证内存安全)、SEC-5.2(资源泄露防护) **代码路径**:common/include/fallback/fallback.h:122,130,138(新增行 138-146) **问题类型**:资源泄露(dlopen 无 dlclose) **问题描述**:GetOpApiFuncAddr() 函数中通过 dlopen 获取的 3 个动态库句柄(custOpApiHandler、opApiHandler、transformerOpApiHandler)均以 static 变量存储,但从未调用 dlclose 释放。虽然这些库需要持续可用直到进程结束(动态图 fallback 场景),且进程退出时 OS 会回收资源,但缺少显式释放路径不符合 SEC-5.2 "资源申请和释放必须匹配" 的要求。本次 PR 新增的 transformerOpApiHandler 沿用了相同的模式。 **风险等级评估**: - 当前场景(进程级生命周期、无 dlclose 需求):风险可控,MED 级别 - 未来若需要支持库的热加载/卸载:风险升级,需补充 dlclose 逻辑 **是否为本次 PR 引入**:❌ 否,为预存在问题延续 #### 修改建议 **当前代码**(新增部分): ```cpp static auto transformerOpApiHandler = GetOpApiLibHandler(GetTransformerOpApiLibName()); if (transformerOpApiHandler != nullptr) { auto funcAddr = GetOpApiFuncAddrInLib(transformerOpApiHandler, GetTransformerOpApiLibName(), apiName); if (funcAddr != nullptr) { return funcAddr; } } ``` **建议方案**(可选,非紧急): 1. 短期:保持现状,在代码注释中说明设计意图(进程级生命周期,无需 dlclose) 2. 长期:如需支持库卸载,可引入 RAII 管理类封装 dlopen/dlclose **修改说明**:当前设计在动态图 fallback 场景下是合理的(库需持续可用),建议添加注释说明设计意图,而非立即修改。若未来需要库热加载功能,则需要补充 dlclose 和 handler 生命周期管理。 --- ### 问题ID:ISSUE-002 | 严重级别:MEDIUM(需关注)— 预存在 bug #### 🔬 假设检验过程 **代码段**:GetAclnnArrdByApiName() 函数(行105-119) **假设**:H0: 该代码段能正确搜索所有 aclnn 库 | 证据序号 | 证据类型 | 规范ID | 证据描述 | 分值增量 | 累计自信值 | |---------|---------|--------|---------|---------|-----------| | 1 | 规范违反 | TOPK-3 | static auto libHandler 在 for 循环内部声明,只初始化一次(首次迭代),后续迭代复用首次值 | +40% | 40% | | 2 | 函数调用链风险 | TOPK-3 | libHandler 始终为 libaclnn_ops_infer.so 的 handler,6个库中只有第一个被实际搜索 | +25% | 65% | **结论**:自信值 **65%** > 60%,**推翻原假设H0**,该代码段存在逻辑 bug。 --- **关联规范条款**:TOPK-3(生命周期内使用局部变量指针,避免野指针) **代码路径**:common/include/fallback/fallback.h:109 **问题类型**:static 变量在循环内误用导致逻辑错误 **问题描述**:GetAclnnArrdByApiName() 函数在 for 循环内部使用 static auto libHandler = GetOpApiLibHandler(libName.c_str()),由于 static 局部变量只初始化一次,libHandler 在首次迭代时绑定 libaclnn_ops_infer.so 的 handler,后续迭代中 libName 变化但 libHandler 不变,导致只搜索了第一个库。这不是本次 PR 引入的问题,但与新增的 fallback 搜索逻辑相关,可能影响 fallback 链路的完整性。 **是否为本次 PR 引入**:❌ 否,为预存在 bug #### 修改建议 **当前代码**: ```cpp inline void* GetAclnnArrdByApiName(const char *apiName) { vector<std:: string> libs = {"libaclnn_ops_infer.so", "libaclnn_ops_train.so", "libaclnn_math.so", "libaclnn_rand.so", "libaclnn_sparse.so", "libaclnn_fft.so"}; for (const auto &libName : libs) { static auto libHandler = GetOpApiLibHandler(libName.c_str()); // BUG: static 只初始化一次 if (libHandler != nullptr) { auto funcAddr = GetOpApiFuncAddrInLib(libHandler, libName.c_str(), apiName); if (funcAddr != nullptr) { return funcAddr; } } } ``` **修改后代码**: ```cpp inline void* GetAclnnArrdByApiName(const char *apiName) { vector<std::string> libs = {"libaclnn_ops_infer.so", "libaclnn_ops_train.so", "libaclnn_math.so", "libaclnn_rand.so", "libaclnn_sparse.so", "libaclnn_fft.so"}; for (const auto &libName : libs) { auto libHandler = GetOpApiLibHandler(libName.c_str()); // 移除 static,每次迭代重新获取 if (libHandler != nullptr) { auto funcAddr = GetOpApiFuncAddrInLib(libHandler, libName.c_str(), apiName); if (funcAddr != nullptr) { return funcAddr; } } } ``` **修改说明**:移除循环内的 static 关键字,确保每次迭代都能正确获取对应库的 handler。如果需要缓存 handler 避免重复 dlopen,应使用数组或 map 存储,而非在循环内使用 static。 --- ## ✅ 通过条款汇总 | 条款编号 | 条款标题 | 检视结论 | 关键证据 | |---------|---------|---------|---------| | SEC-3.5 | 指针使用前判空 | PASS | transformerOpApiHandlerfuncAddr 在使用前均判空 | | SEC-5.1 | 资源申请后判断是否成功 | PASS | dlopen/dlsym 返回值在 GetOpApiLibHandler/GetOpApiFuncAddrInLib 内部及调用处均判空 | | SEC-10.5 | 接口变更考虑兼容性 | PASS | 新增搜索层在已有搜索失败后执行,不阻断已有成功路径;为有意功能增强 | | SEC-11.2 | LOG API参数数量与占位符匹配 | PASS | 新日志 5个 %s 对应 5个 const char* 参数,完全匹配;修复了原代码 GetOpApiLibName() 重复调用bug | | SEC-11.3 | LOG API参数类型与格式化说明符匹配 | PASS | 所有参数均为 const char* 类型,对应 %s 说明符 | | TOPK-1 | 必须校验函数返回值 | PASS | GetTransformerOpApiLibName()GetOpApiLibHandler()GetOpApiFuncAddrInLib() 返回值均在使用前校验 | | TOPK-12 | 宏定义中临时变量命名 | PASS | 本次 PR 未新增宏内临时变量,仅修改日志格式字符串 | | TOPK-13 | dlopen管理的so禁用thread_local | PASS | 使用 static 而非 thread_local,符合要求;当前无 dlclose 操作,竞态不存在 | ## 📋 检视维度专项总结 ### 1. 安全编码维度 - **内存泄漏**:dlopen handler 无 dlclose(MED,预存在延续,进程级场景可接受) - **空指针风险**:充分保护,所有指针使用前判空(PASS) - **资源管理**:dlopen/dlsym 返回值均校验,但缺少释放路径(MED,预存在延续) ### 2. API使用维度 - **dlopen/dlsym 使用**:API 参数正确,RTLD_LAZY 模式合理(PASS) - **dlopen 错误处理**:失败时记录 dlerror() 日志并返回 nullptr(PASS) ### 3. 性能优化维度 - **static 变量初始化顺序**:transformerOpApiHandlercustOpApiHandleropApiHandler 之后初始化,符合搜索优先级(cust > op > transformer > aclnn) - **库加载顺序**:新增 transformer 库在 opApi 之后搜索,合理——自定义库优先,通用库次之,transformer 专用库第三 - **潜在性能影响**:新增 dlopen 调用仅在首次访问时执行(static 初始化),后续调用直接使用缓存的 handler,无性能损失 ### 4. 代码规范维度 - **命名规范**:GetTransformerOpApiLibNameGetOpApiLibName/GetCustOpApiLibName 命名风格一致(PASS) - **日志格式一致性**:新日志格式与已有格式一致,修复了原日志的参数重复 bug(PASS) - **代码风格一致性**:新增代码块的缩进、花括号风格与已有 opApiHandler 搜索块完全一致(PASS) ### 5. 逻辑正确性维度 - **搜索顺序**:custOpApi → opApi → transformerOpApi → aclnn,优先级合理(PASS) - **fallback 链路完整性**:新增 transformer 层在已有搜索失败后执行,不阻断已有路径(PASS) - **遗漏场景**:GetOpApiFuncAddr 函数覆盖了所有库搜索场景;EXEC_OPAPI_CMD 宏中的日志更新包含了新增库名(PASS) - **⚠️ 预存在 bug**:GetAclnnArrdByApiNamestatic auto libHandler 在循环内误用,导致 aclnn fallback 只搜索第一个库(MED,非本次 PR 引入,建议单独修复) ### 6. 风险点维度 - **死循环**:不存在(PASS) - **竞态条件**:static 初始化线程安全(C++11 magic statics),无 dlclose 操作所以无 handler 失效竞态(PASS) - **符号冲突**:搜索顺序确保优先级,custOpApi 中找到的符号不会被 transformer 库覆盖(PASS) - **dlopen 线程安全**:dlopen 本身是线程安全的(POSIX 规定),static 初始化也是线程安全的(PASS) ## 报告生成时间 2026-05-29 ## 报告状态 已完成检视,2处需关注问题(均为预存在延续),1处预存在bug建议单独修复 See merge request: cann/ops-transformer!60944 天前
move fallback files to op graph lib Co-authored-by: liusixia<liusixia@h-partners.com> # message auto-generated for no-merge-commit merge: !4133 merge master into master move fallback files to op graph lib Created-by: liusixia_gitcode Commit-by: liusixia Merged-by: cann-robot Description: ## 描述 动态图相关:仓内aclnn回调的fallback文件,在内置工程(built-in pkg)下,由ophost.so 改为编入opgraph.so中;自定义工程(custom pkg)下,保持不变。 其中,mc2算子的fallback文件当前均include了依赖tiling的头文件(mc2_log.h),统一将其与tiling解耦,使用mc2_common_log.h。 ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/1844 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [x] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!41331 个月前
/lgtm Co-authored-by: wuhaogl<wuhao305@h-partners.com> # message auto-generated for no-merge-commit merge: !537 merge master into master 适配最新cann版本,更新编译选项 Created-by: wuhaogl Commit-by: wuhaogl Merged-by: cann-robot Description: ## 描述 适配最新cann版本,更新编译选项 ## 关联的Issue 关联Issue https://gitcode.com/cann/ops-transformer/issues/314 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-transformer!5375 个月前
/lgtm Co-authored-by: wuhaogl<wuhao305@h-partners.com> # message auto-generated for no-merge-commit merge: !537 merge master into master 适配最新cann版本,更新编译选项 Created-by: wuhaogl Commit-by: wuhaogl Merged-by: cann-robot Description: ## 描述 适配最新cann版本,更新编译选项 ## 关联的Issue 关联Issue https://gitcode.com/cann/ops-transformer/issues/314 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-transformer!5375 个月前