在带有clang的ubsan的boost版本1.64中运行gzip.hpp
代码会显示以下消息:
path/to/boost/1_64_0/include/boost/iostreams/filter/gzip.hpp:674:16: runtime error: implicit conversion from type 'int' of value 139 (32-bit, signed) to type 'char' changed the value to -117 (8-bit, signed)
#0 0x7fed40b77bc2 in boost::iostreams::basic_gzip_compressor<std::allocator<char> >::basic_gzip_compressor(boost::iostreams::gzip_params const&, long)
我想使用抑制文件来抑制这种情况。对于其他警告,此方法有效:
unsigned-integer-overflow:path/to/boost/*
在这种情况下,我希望这应该起作用
implicit-integer-sign-change:/lfs/vlsi/tools/boost/*
但它在运行时提供
UndefinedBehaviorSanitizer: failed to parse suppressions
此消毒剂标志的正确名称是什么?
另请参阅:https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html#runtime-suppressions
和来自https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html#available-checks
-fsanitize = implicit-integer-sign-change:整数类型之间的隐式转换,如果这会更改值的符号。也就是说,如果 原始值为负,新值为正(或 零),或者原始值为正,而新值为 负。此消毒剂捕获的问题不是未定义的行为, 但通常是无意的。
答案 0 :(得分:2)
我在llvm cfe-dev mailing list上得到了帮助
TLDR:警告类型的名称不是implicit-integer-sign-change
,而是implicit-integer-truncation
,可以按预期将其抑制。可以使用export UBSAN_OPTIONS=report_error_type=1
找出错误类型的名称。
答案 1 :(得分:0)
根据此文档,您正在阅读,并使用以下步骤禁止显示UBSan消息:
禁用仪器 with__attribute __((no_sanitize(“ undefined”)))¶
您禁用UBSan检查特定功能 与
__attribute__((no_sanitize("undefined"))).
一起使用 -fsanitize =标志在此属性中,例如如果你的功能 故意包含可能的有符号整数溢出,您可以 使用__attribute __((no_sanitize(“ signed-integer-overflow”)))。其他编译器可能不支持此属性,因此请考虑 与#ifdefined( clang )一起使用。
因此,您应该做的是:检查同一页上的文档以了解您要删除的内容,并用use__attribute__((no_sanitize("here_goes_checks_you_want_to_suppress"))).
或use__attribute__((no_sanitize("undefined"))).
进行共轭以完全禁用UBSan。
其中一部分似乎是UBSan抛出了SIGNED整数溢出,而您正试图抑制UNSIGNED整数溢出。
链接:https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html