已关闭
[Bug-Report|缺陷反馈]: int32 结果比较对合法极值执行减法/abs导致有符号溢出 #739
tianjun创建于 24 天前关闭于 21 天前
tianjun
24 天前 评论:
24 天前 评论:
/assign @Ethan_Zou


24 天前 将 Ethan_Zou 设为负责人
yuantao
23 天前 评论:
23 天前 评论:
感谢提供详细的复现步骤。确认这是实现里的真实缺陷。examples/common/golden/compare_data.hpp:181 的 int32_t 特化用 std::abs(actualValue - expectValue) 判等,而两个 int32 直接相减本身就可能溢出:INT32_MAX 与 -1 的差、以及 INT32_MIN 取绝对值都超出 int32 可表示范围,属于有符号整数未定义行为,与描述一致。
建议把该特化的判等改为直接的 actualValue != expectValue,既绕开减法与 abs,也保留原有的相等语义和下标顺序,再补一组极值交叉组合作为回归用例即可。
By DeepSeek-V4.1-Flash


22 天前 添加了label:bug-report
21 天前 关闭了 issue
21 天前 添加了label:resolved
11 天前 关联了pull request:[docs]: synchronize integer comparison examples with the fixed implementation
11 天前 关联了pull request:[docs]: synchronize integer comparison examples with the fixed implementation
Describe the current behavior / 问题描述
examples/common/golden/compare_data.hpp 的 int32_t 特化用 std::abs(actualValue - expectValue) 判断是否相等。合法 int32 输入 INT32_MAX 与 -1 的差无法用 int32 表示;INT32_MIN 与 0 的绝对值也不可表示。实际完整生产头文件在 Host UBSan 下退出 1,属于有符号整数未定义行为。
Environment / 环境信息
DevEnvC_mmdv8,Ubuntu 20.04.5 LTS/aarch64;g++ 9.4.0、GoogleTest 1.14.0。仅 Host CPU,未运行 NPU、设备 kernel、STUB 或整库 NPU 构建,不声称 CANN/芯片/其他版本兼容。基线 master 46155c7f7a779a9b6ed5b6aa06532e79e4ea2e80。
Steps to reproduce / 重现步骤
使用完整生产头文件,不抽取函数,也不 mock SDK:
#include <algorithm> #include <cstdint> #include <limits> #include <vector> #include "examples/common/golden/compare_data.hpp" int main() { auto errors = Catlass::golden::CompareData( std::vector<int32_t>{std::numeric_limits<int32_t>::max()}, std::vector<int32_t>{-1}, 1); return errors.size() == 1 ? 0 : 1; }Expected / 预期结果
按 int32 精确相等规则返回不匹配下标,无溢出或未定义行为。直接 actualValue != expectValue 可保留既有相等判定与下标顺序,无需减法和 abs。
Related log / 实测结果
原版真实诊断:signed integer overflow: 2147483647 - -1 cannot be represented in type 'int'。
新增 CPU COMMON 注册测试含 49 组 int32 极值/普通值交叉组合,以及空数组、相等极值数组、混合错误下标。每组覆盖 computeNum 1/2047/2048/4096。
同一最终 52 项 UT 在基线逐项通过 GTEST_FILTER 运行,UBSan 保持 fail-stop:17 失败、35 通过;修复后同一 52 项全部通过。原生 main 无参数,命令行过滤不生效,已用环境过滤并逐项核实只运行 1 项,未改 runner。
完整原有 CPU COMMON 源文件加新增测试共 63 项,在同样 UBSan 下全部通过;最终唯一源提交 41be7eee0b877750ecca297b082772ebee7c57a8 复核 52 项通过。使用真实原生 runner 和 GoogleTest,无函数或 SDK mock。
实际验证命令(GTest 源码/对象均为本机已核验 1.14.0):
GTEST_SRC=/home/developer/AI/CANN-Issue-PR/rated-20261011/runtime/hcomm-directory-native-build/third_party_gtest-prefix/src/third_party_gtest/googletest GTEST_OBJ=/home/developer/AI/CANN-Issue-PR/rated-20261011/evidence/catlass-bits-to-bytes-screen/gtest-1.14.0.o g++ -std=c++17 -O2 -pthread -fsanitize=undefined -fno-sanitize-recover=undefined \ -Iinclude -I"$GTEST_SRC/include" tests/unittest/catlass_unittest.cpp \ tests/unittest/catlass/test_compare_int32.cpp "$GTEST_OBJ" -o /tmp/compare_int32_ut /tmp/compare_int32_ut GTEST_FILTER='Int32Range/CompareInt32Test.ExactEqualityAcrossInt32Range/0' /tmp/compare_int32_ut python3 -m pre_commit run --files examples/common/golden/compare_data.hpp tests/unittest/catlass/test_compare_int32.cpp git diff --check git fsck --full git lfs fsck原始适用 pre-commit/commit 钩子及 Git/LFS 检查通过;仓库原配置排除 tests,新增 UT 另用 clang-format 18.1.8 显式格式化。CPU COMMON 原 CMake glob 自动注册,无检查、CMake 或许可配置改动;生产文件原版权头保留,新增测试遵循仓库 Huawei2026 CANN-2.0 头。
Special notes / 查重
核对所有作者、所有状态 705 Issue/1442 PR,发布前再刷新各30条。Issue205 是偏移乘法溢出,605/623 是浮点 NaN/退出码,709/1412 是浮点误差比值,与本次 int32 相等比较的减法/abs 未定义行为独立;未重复调查或发布上述问题。