如何让 AddressSanitizer 不检查第三方库

mas*_*cot 5 c++ gcc cmake address-sanitizer

我正在研究一个 C++ cmake 项目。除了我自己的源代码,我的项目使用了很多第三方库。因此,我正在使用 /usr/local/lib 中存在的共享库(带有 .so 扩展名),并且对于某些代码存在于 /usr/local/include 中。(就像我使用 /usr/local/include/eigen3/ 中存在的特征库一样)。

如何确保 Address Sanitizer 只检查我的源代码,而不检查任何标准或第三方库?

PS:目前,我正在使用如下所示的地址消毒剂:

ADD_COMPILE_OPTIONS(-O0 -g -Wall -fsanitize=address -fno-omit-frame-pointer)
SET(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
Run Code Online (Sandbox Code Playgroud)

我正在使用 gcc 版本:

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609

w-m*_*w-m 5

AddressSanitizer 的工作原理是在编译期间插入代码(带有标志-fsanitize=address)。因此,您的代码链接到的第三方库中的大多数代码将不受影响,也不会被 AddressSanitizer 检查,因为它们已经内置到共享库文件中。如果第 3 方调用标准函数(memset 等),它仍然会被检查。

头文件和仅头文件库(例如 Eigen)中的代码是一种特殊情况,因为所有 Eigen 代码都会直接插入到源文件中(通过包含),因此也使用-fsanitize=address.

由于编译器不区分您的代码和包含的第三方代码,因此无法禁用仅包含标头的第三方代码的清理程序。

但实际上这通常不会引起任何问题。使用 clang 时,您可以创建一个清理黑名单文件来隐藏不需要的误报(您无法修复上游)。不幸的是 gcc 还不支持黑名单。