簡體   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