4

使用 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:整数类型之间的隐式转换,如果这改变了值的符号。也就是说,如果原值为负,新值为正(或零),或者原值为正,新值为负。此消毒剂捕获的问题不是未定义的行为,而是通常是无意的。

4

2 回答 2

3

我在 llvm cfe-dev 邮件列表上得到了帮助

TLDR:警告类型的名称不是implicit-integer-sign-change,而是implicit-integer-truncation可以按预期抑制。可以使用 找到错误类型的名称export UBSAN_OPTIONS=report_error_type=1

于 2019-01-28T08:03:15.070 回答
0

根据您正在阅读的这个文档,您可以使用以下步骤抑制 UBSan 消息:

使用 __attribute__((no_sanitize("undefined")))禁用检测

您可以使用 -fsanitize= 标志的所有值在此属性中禁用特定函数的 UBSan 检查 __attribute__((no_sanitize("undefined"))).,例如,如果您的函数故意包含可能的有符号整数溢出,则可以使用 __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

于 2018-11-25T10:56:56.540 回答