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

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;
}
g++ -std=c++17 -O1 -g -fsanitize=undefined -fno-sanitize-recover=undefined -I. -Iinclude /tmp/compare.cpp -o /tmp/compare
/tmp/compare

Expected / 预期结果

按 int32 精确相等规则返回不匹配下标,无溢出或未定义行为。直接 actualValue != expectValue 可保留既有相等判定与下标顺序,无需减法和 abs。

原版真实诊断: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 未定义行为独立;未重复调查或发布上述问题。

likedislike
tianjun
24 天前 评论:

/assign @Ethan_Zou

likedislike
CANN-robotCANN-robot成员
24 天前 将 Ethan_Zou 设为负责人
Ttianjun
24 天前 关联了pull request:fix: avoid signed overflow in int32 result comparisons
yuantao
yuantao成员
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

likedislike
longjihuilongjihui成员
22 天前 添加了label:bug-report
CANN-robotCANN-robot成员
21 天前 关闭了 issue
CANN-robotCANN-robot成员
21 天前 添加了label:resolved
aodebiaoaodebiao
11 天前 关联了pull request:[docs]: synchronize integer comparison examples with the fixed implementation