如何针对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
相关产品推荐
相关产品推荐

