| fix(datacompare): 静态扫描整改(Host校验补全/UB预算重算/空Tensor输出修复/入口改名/资料与用例同步) Co-authored-by: chen_chenn<chenchen167@huawei.com> # message auto-generated for no-merge-commit merge: !7165 merge fix/datacompare_static_scan_fixes into master fix(datacompare): 静态扫描整改(Host校验补全/UB预算重算/空Tensor输出修复/入口改名/资料与用例同步) Created-by: chen_chenn Commit-by: chen_chenn Merged-by: cann-robot Description: ## 背景 2026-10-26 静态扫描(static-st-review)对 data_compare 产出 62 条发现(P1×17、P2×45)。本 PR 落地其中**源码侧**的评审整改决策(交付资料侧整改在 operator-artifacts 仓同名分支 fix/datacompare_static_scan_fixes)。 ## 源码修复(P1) | # | 修复 | 说明 | |---|------|------| | 1 | atol/rtol 值域校验 | Tiling 侧补 [0,1e38] 范围校验(NaN 一并拦截);原越界容差静默进入 Kernel,负阈值导致计数被系统性放大且无错误码 | | 2 | x1/x2 dtype 一致性校验 | 原全链路无校验,dtype 不一致时 Kernel 按 x1 dtype 误读 x2、静默输出错误计数 | | 3 | x1/x2 format 校验 | origin format 非 ND 在 Tiling 兜底拦截(L2 format 异常用例) | | 4 | 输出 dtype 校验 | InferDataType 校验调用方声明的输出 dtype,非 float32/UNDEFINED 拦截 | | 5 | UB 预算重算 | ComputeUbFactorTailR 按对齐后 rUbFactorAlign 与 32B 输出缓冲重算,消除 fp32[11873–11878] / fp16[16961–16969] / int8[21569–21597] 三段 UB 超限触发窗口(原申请峰值超出 248KB UB 最多 128B) | | 6 | 空 Tensor 输出修复 | HandleEmptyTensor 改 EMPTY_R 单核写 0.0f(原 usedCoreNum=0,唯一核早退,输出保持设备内存残留值且全流程返回成功) | | 7 | Kernel 入口改名 | data_compare_apt.cpp → data_compare.cpp(op_kernel 下禁止 _apt 后缀),同步 opFile.value | ## 资料与测试同步 - **README(中/英双语同步)**:调用表按模板修正(列名/GE图模式术语/行尾竖线);约束补齐 fp32 升精度口径、atol/rtol 值域、format 仅 ND、动态 shape 契约;参数表顺序调整为与注册一致(x1、x2、num、atol、rtol);新增 README_en.md 英文版 - **UT**:空 Tensor 断言改 EMPTY_R 语义(usedCoreNum=1、axisShape[0]=1、postReduceUbSize=32B);新增负 atol/负 rtol/超上界/NaN/dtype 不一致/x1 format 非 ND/x2 format 非 ND 共 8 个失败用例;补齐标准 CANN 许可证头(OAT 合规) - **ST(L1,20→21 条)**:用例名去 aclnnDataCompare_ 前缀(ACLNN 通路不交付,构建声明 aclnn_exclude);precision_tolerances 修正为精确匹配口径(0/0,原被算子 atol/rtol 属性占用,放大约 95~98 倍);输出 shape 统一 0 维(与 InferShape 一致);新增空 Tensor 用例 ## 验证 - README 公共校验器 validate_operator_readme.py --mode full:**STATUS: PASSED**(整改前 FAIL/exit 1) - Tiling 算法 Python 1:1 复刻跑全部 UT 用例参数:**35/35 PASS**(含空 Tensor 端到端“单核写 0.0f”模拟) - UB 触发窗口逐元素数模拟:三段窗口全部 ≤248KB(峰值 253856B ≤ 253952B),边界用例(11872 整装 / 23744 Group)行为不变 - L2 全 11 条异常用例拦截走查通过,9 类合法输入(含空 Tensor/rank0/rank8/未声明输出)零误伤 - 12 个文件全部通过 clang-format --style=file 与 OAT 许可证头检查 - tiling.cpp / infershape.cpp 经 g++ -fsyntax-only(CANN stub 头)类型检查通过 ## 影响面与回归建议 - 修改集中在 math/data_compare/,无跨算子影响 - **行为变化(预期收紧)**:非法输入(dtype 不一致 / format 非 ND / 容差越界 / 输出 dtype 非法)从静默计算/静默成功改为报错拦截 - 建议合入后上板回归 L0 220 条 + L1 21 条 + L2 11 条异常用例 ## 关联 - 静态扫描报告:Longtail-fix/group_03/DataCompare/result/static-st-review-20261026/ - 交付资料侧(REQUIREMENTS/DESIGN/spec.yaml/Golden/用例):operator-artifacts 仓 fix/datacompare_static_scan_fixes 分支 See merge request: cann/ops-math!7165 | 4 days ago |