C ++ clang UBsan抑制标志名称

时间:2018-11-25 10:14:36

标签: c++ clang++ ubsan

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

2 个答案:

答案 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