带 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)
我正在尝试使用带有 -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)