[英]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.