带 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)

main.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

最后,我得到的错误是:

这是怎么回事? 我应该 link 使用一些图书馆吗?

使用地址清理器 link 的最简单方法是将 -fsanitize=address 指定为 linker 以及编译器选项。这会导致 clang 或 gcc 将正确的库和标志传递给 linker。

我相信您忘记了将 -fsanitize 传递给 link 选项,就像提到的其他答案一样。所以你需要两个:

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)