GCC Address Sanitizer - 将库函数列入黑名单(特别是boost :: test)

时间:2015-01-15 14:50:18

标签: c++ gcc boost boost-test

我的所有单元测试代码都基于boost::test。我刚刚尝试了GCC地址清洁剂,它报告了一些与boost :: test:

有关的问题
==25309==ERROR: AddressSanitizer: heap-use-after-free on address 0xf5801344 at pc 0x8259412 bp 0xff9966c8 sp 0xff9966bc
READ of size 4 at 0xf5801344 thread T0
#0 0x8259411 in boost::unit_test::framework::run(unsigned long, bool)     ../common/lib/boost/boost/test/impl/framework.ipp:450
#1 0x82732f7 in boost::unit_test::unit_test_main(bool (*)(), int, char**) ../common/lib/boost/boost/test/impl/unit_test_main.ipp:185
#2 0x827b5a3 in main ../common/lib/boost/boost/test/unit_test.hpp:59
#3 0x213ce5 in __libc_start_main (/lib/libc.so.6+0x16ce5)
#4 0x8238680 (/home/marpashl/lte/sw/build/x86/bin/framework_unit_test+0x8238680)

我想隐藏此消息(因为它是针对测试库中的已知错误),因此我只能在自己的代码中看到问题。

GCC有没有办法做到这一点?

注意编译器版本GCC:/opt/gcc-x86-4.9.2/bin/c ++

我发现CLANG文件可以使用-fsanitize-blacklist=blacklist.txt列入黑名单,但目前GCC目前无法使用。

2 个答案:

答案 0 :(得分:3)

如果sanitize-blacklist不可用,但您可以访问源代码,则可以使用函数属性排除单个函数的清理:

它得到了Clang(3.3+)和GCC(4.8+)的支持。您可以定义以下宏:

#if defined(__clang__) || defined (__GNUC__)
# define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
#else
# define ATTRIBUTE_NO_SANITIZE_ADDRESS
#endif
...
ATTRIBUTE_NO_SANITIZE_ADDRESS
void ThisFunctionWillNotBeInstrumented() {...}

有关详细信息,请参阅this page

答案 1 :(得分:1)

参加聚会有点晚,但值得: 您还可以通过环境变量将黑名单文件作为选项传递给清理程序。如果您无权访问源代码,例如

,这很有用。
LSAN_OPTIONS=suppressions=blacklist.txt ./unit-tests