繁体   English   中英

如何使AddressSanitizer不检查第三方库

[英]How to make AddressSanitizer not check third party libraries

我正在从事C ++ cmake项目。 除了我自己的源代码外,我的项目还使用许多第三方库。 因此,我正在使用/ usr / local / lib中存在的共享库(带有.so扩展名),而对于某些代码,则存在于/ usr / local / include中。 (就像我使用的是/ usr / local / include / eigen3 /中的本征库一样)。

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

PS:目前,我正在使用Address Sanitizer,如下所示:

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

我在版本中使用gcc:

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

AddressSanitizer通过在编译过程中插入代码(带有-fsanitize=address标志)来工作。 因此,您的代码链接到的第三方库中的大多数代码将不会受到影响,并且不会被AddressSanitizer进行检查,因为它们已经内置在共享库文件中。 如果第三方调用标准功能(内存集等),则仍会进行检查。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM