在CMake中启用AddressSanitizer的正确方法是什么?

问题描述 投票:18回答:3

我添加了AddressSanitizer标志如下:

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")

使用Unix Makefiles时,一切都建立并运行良好。

生成Xcode项目时出现问题,它只是不想链接,因为它找不到ASan库。

我已经找到了两个解决方案,但决定不使用它们,因为它们不能仅使用CMake自动化:

  1. -Wl,-undefined,dynamic_lookup添加到链接标志,因此它会跳过链接到动态库。
  2. 直接链接libclang_rt.asan_osx_dynamic.dylib

那么这两种解决方案的问题是什么?

  • 使用解决方案#1时,我必须在Xcode中手动打开目标方案,并添加指向DYLD_INSERT_LIBRARIESlibclang_rt.asan_osx_dynamic.dylib环境变量。
  • 使用解决方案#2时,ASan库的路径因计算机而异。

另外作为另一种解决方案,我尝试从Xcode目标方案启用Address Sanitizer标志,但有趣的是它没有检测到我添加的问题,因此我没有将其列为解决方案,因为它未通过我的测试。

任何帮助都感激不尽。

c++ cmake clang address-sanitizer
3个回答
10
投票

您还需要向链接器提供标志。我是这样做的:

set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address")
set (CMAKE_LINKER_FLAGS_DEBUG "${CMAKE_LINKER_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address")

3
投票

cmake 3.13 介绍xcode schema的配置

在CMake

cmake_minimum_required(VERSION 3.13)
set(CMAKE_XCODE_GENERATE_SCHEME ON)
set(CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER ON)
set(CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN ON)

什么时候构建

xcodebuild -enableAddressSanitizer YES

3
投票

我目前发现的最简单的解决方案是

cmake -DCMAKE_BUILD_TYPE=ASAN .

我更喜欢这个选项,因为它表达了意图(运行清理程序)而不是修改了许多标志。

我不知道何时添加了此选项。我也找不到任何文件。

© www.soinside.com 2019 - 2024. All rights reserved.