| fix: fix logic errors, bounds issues, and undefined behavior from security audit Co-authored-by: xiu_21<caixiuxiu1@huawei.com> # message auto-generated for no-merge-commit merge: !4987 merge security_code into master fix: fix logic errors, bounds issues, and undefined behavior from security audit Created-by: xiu_21 Commit-by: xiu_21 Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [ ] 需求 - [x] 问题单 - [ ] issue/工单 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 修改代码中存在的逻辑错误、边界问题和未定义行为。 ### 1. 逻辑运算符错误(2处,|| → &&) | 文件 | 问题 | 修改 | |------|------|------| | [FusedAttentionLnQKV.cpp:28](op_plugin/ops/aclops/FusedAttentionLnQKV.cpp#L28) | seq_len != 0 \|\| num_heads != 0 导致单参数为零时校验被绕过 | 改为 seq_len != 0 && num_heads != 0 | | [FftRfftKernelNpuOpApi.cpp:49](op_plugin/ops/opapi/FftRfftKernelNpuOpApi.cpp#L49) | (dim < self.dim() \|\| dim >= 0) 导致越界 dim 仍通过校验 | 改为 (dim >= 0 && dim < self.dim()) | ### 2. 越界/空值校验(7处,添加前置检查) | 文件 | 问题 | 修改 | |------|------|------| | [CtcLossKernelNpu.cpp:43](op_plugin/ops/aclops/CtcLossKernelNpu.cpp#L43) | shape[2] 在 log_probs 为 2D tensor 时越界 | 根据 dim() 选择 shape[2] 或 shape[1] | | [AdaptiveMaxPool2dKernelNpu.cpp:53-56](op_plugin/ops/aclops/AdaptiveMaxPool2dKernelNpu.cpp#L53-L56) | self.size(3) 在 self 为 3D tensor 时越界 | 根据 dim() 区分 3D/4D 索引映射 | | [UpsampleBilinear2dKernelNpu.cpp:35](op_plugin/ops/aclops/UpsampleBilinear2dKernelNpu.cpp#L35) | output_size[1] 前仅校验 size() >= 1 | 改为校验 size() >= 2 | | [ConfusionTransposeKernelNpu.cpp:87](op_plugin/ops/aclops/ConfusionTransposeKernelNpu.cpp#L87) | temp_perm[perm[i]] 索引值未校验范围 | 添加 TORCH_CHECK(perm[i] >= 0 && perm[i] < perm_len) | | [MmKernelNpu.cpp:170](op_plugin/ops/aclops/MmKernelNpu.cpp#L170) | self.size(self.dim()-2) 在维度不足时越界 | 添加 TORCH_CHECK(self.dim() >= 2 && mat2.dim() >= 2) | | [FFTc2rKernelNpuOpApi.cpp:29](op_plugin/ops/opapi/FFTc2rKernelNpuOpApi.cpp#L29) | dim.back() 未校验数组是否为空 | 添加 TORCH_CHECK(!dim.empty()) | | [model.py:67-70](torchnpugen/struct/model.py#L67-L70) | info.pop() 时 info 可能为 None | 添加 if info is None: raise RuntimeError 提前拦截 | | [struct_codegen.py:35](torchnpugen/struct/struct_codegen.py#L35) | os.environ.get('PYTORCH_VERSION') 未设置时返回 None,.split() 崩溃 | 拆分调用:先判空、再 split、再校验长度 >= 2 | ### 3. 悬垂引用/指针(2处,延长生命周期) | 文件 | 问题 | 修改 | |------|------|------| | [AvgPool2dBackwardKernelNpu.cpp:82-97](op_plugin/ops/aclops/AvgPool2dBackwardKernelNpu.cpp#L82-L97) | SmallVector 在 if 块内销毁,IntArrayRef 成为悬垂引用 | 将 SmallVector 声明提到 if 块外部 | | [CropAndResizeKernelNpu.cpp:34](op_plugin/ops/aclops/CropAndResizeKernelNpu.cpp#L34) | std::string(method).data() 临时 string 销毁后指针悬垂 | 声明命名 std::string method_str 变量 | ### 4. 函数无返回值(1处) | 文件 | 问题 | 修改 | |------|------|------| | [AtbCommon.h:87](op_plugin/utils/custom_functions/atb/AtbCommon.h#L87) | GetApiFuncAddr 双 handler 均 null 时函数无 return,未定义行为 | 末尾添加 return nullptr | ### 5. 类型收窄/溢出/API返回值检查(5处) | 文件 | 问题 | 修改 | |------|------|------| | [CdistKernelNpu.cpp:71-72](op_plugin/ops/aclops/CdistKernelNpu.cpp#L71-L72) | int 类型存储 int64_t 累乘结果,可能截断 | 改为 int64_t,初始化值改为 int64_t(1) | | [LinalgQrKernelNpu.cpp:29-31](op_plugin/ops/aclops/LinalgQrKernelNpu.cpp#L29-L31) | int m, n 将 int64_t 的 tensor 维度截断为 32 位 | 改为 int64_t | | [AdaptiveAvgPool3dBackwardKernelNpu.cpp:33-34](op_plugin/ops/aclops/AdaptiveAvgPool3dBackwardKernelNpu.cpp#L33-L34) | 多维度 size 累乘可能溢出 int64_t | 乘法前加 TORCH_CHECK(size <= INT64_MAX / next_dim) | | [AsdSipNpuOpApi.h:248-265](op_plugin/utils/custom_functions/opapi/AsdSipNpuOpApi.h#L248-L265) | FFT API(Create/MakePlan/Sync/Destroy)返回值全部忽略 | 每个调用加 TORCH_CHECK(ret == 0) | | [BatchNormElemtKernelNpuOpApi.cpp:42-43](op_plugin/ops/opapi/BatchNormElemtKernelNpuOpApi.cpp#L42-L43) | optional weight/bias 直接传给 NPU 命令 | 先用 c10::value_or_else 解包为默认空 tensor 再传入 | # 【资料变更】 不涉及 # 【接口变更】 不涉及 # 【功能验证】 > 说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤\ > 新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图 # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/op-plugin!4987 | 27 天前 |