簡體   English   中英

帶有 CMake 的 LLVM 地址清理器

[英]LLVM address sanitizer with CMake

我正在嘗試使用帶有 -fsanitize=address 選項的 clang 編譯最簡單的可執行文件。 直接使用 clang 來做到這一點非常簡單。 但我的觀點是通過 CMake 做到這一點。

我就是這樣做的。 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.5.1 FATAL_ERROR)
project(TestSanitizer VERSION 0.1.0 LANGUAGES CXX)
add_executable(Test main.cpp)
target_compile_options(Test PUBLIC
    -std=c++17
    -Werror
    -Weverything
    -Wno-c++98-compat
    -Wno-c++98-c++11-c++14-compat
    -Wno-c++98-compat-pedantic
    -fsanitize=address)

主.cpp:

int main(int, const char**) { return 0; }

使用 bash 腳本(config_gen_build.sh)配置和制作:

if [ -d "bin" ]; then
    rm -rf bin
fi

mkdir bin
cd bin

#config and gen
export CC=/usr/bin/clang-5.0
export CXX=/usr/bin/clang++-5.0
cmake ./../

#build
make

最后,我得到的錯誤: 在此處輸入圖片說明

這里有什么問題? 我應該鏈接一些圖書館嗎?

與地址清理器鏈接的最簡單方法是將-fsanitize=address指定為鏈接器和編譯器選項。 這會導致 clang 或 gcc 將正確的庫和標志傳遞給鏈接器。

我相信您忘記將-fsanitize傳遞給鏈接選項,就像提到的其他答案一樣。 所以你需要兩者

target_compile_options(Foo PUBLIC -fsanitize=address)
target_link_options(Foo PUBLIC -fsanitize=address)

或者,要為整個項目啟用此功能,您可以在項目文件的開頭使用以下 CMake 指令:

add_compile_options(-fsanitize=address)
add_link_options(-fsanitize=address)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM