You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何针对C++标准库禁用UBSAN的移位检测规则?

问题

使用UBSAN时触发标准库左移未定义行为错误,具体信息如下:

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk/usr/include/c++/v1/__functional/hash.h:107:40: runtime error: left shift of 7308895138221481827 by 48 places cannot be represented in type 'unsigned long'

尝试通过UBSAN_OPTIONS传入抑制文件排除该错误,使用shift-base:hash.h、shift-exponent:hash.h无效,直接写shift:hash.h会触发抑制文件解析失败:

UndefinedBehaviorSanitizer: failed to parse suppressions

解决方案

1. 正确的抑制规则写法

UBSAN的移位类错误分为shift-base(基数左移后溢出)和shift-exponent(移位指数超出类型范围)两种,需分别指定抑制规则,且路径匹配需要足够精确:

  • 通配符匹配文件名(推荐):
    在抑制文件中添加以下内容,匹配包含__functional/hash.h的路径:

    shift-base:*__functional/hash.h
    shift-exponent:*__functional/hash.h
    
  • 精确匹配完整路径:
    直接复制错误中的完整文件路径,确保规则完全匹配:

    shift-base:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk/usr/include/c++/v1/__functional/hash.h
    shift-exponent:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk/usr/include/c++/v1/__functional/hash.h
    
  • 按函数名抑制:
    如果路径匹配仍无效,可结合错误栈中的 mangled 函数名精准抑制(复制错误栈中的函数签名即可):

    shift-base:_ZNKSt3__118__murmur2_or_cityhashImLm64EE22__rotate_by_at_least_1Emi
    shift-exponent:_ZNKSt3__118__murmur2_or_cityhashImLm64EE22__rotate_by_at_least_1Emi
    

2. 生效验证

设置环境变量指定抑制文件路径,重新运行程序:

export UBSAN_OPTIONS="suppressions=/path/to/your/suppress-file.txt"

检查控制台是否不再输出目标错误信息。

3. 无效原因说明

  • UBSAN没有shift这个单独的抑制类型,移位错误必须拆分为shift-base和shift-exponent分别指定,直接写shift:hash.h会导致解析失败。
  • 仅写shift-base:hash.h可能因路径匹配精度不足失效,UBSAN默认需要匹配文件的完整路径或带前缀的相对路径,单独的hash.h可能无法匹配到标准库中的目标文件。

内容的提问来源于stack exchange,提问作者Gorez Tony

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 13:44:54