c++ - 如何解决苹果设备上的“clang:错误:不支持的选项“-fsanitize=leak”
问题描述
我正在尝试运行一个简单的泄漏检查程序。
#include <iostream>
int main()
{
double *ptr = new double(3.14);
}
使用命令
g++ -g -fsanitize=leak -o main main.cpp
我收到以下错误:
clang: error: unsupported option '-fsanitize=leak' for target 'x86_64-apple-darwin20.1.0'
我停止使用 Xcode 附带的 clang,并使用自制软件安装了 clang/LLVM。
$ which clang++
/usr/local/opt/llvm/bin/clang++
clang++ --version
clang version 11.0.0
Target: x86_64-apple-darwin20.1.0
Thread model: posix
InstalledDir: /usr/local/opt/llvm/bin
编辑:当我使用苹果 clang 时,g++ 曾经默认为 clang++。显然,当我安装 llvm/clang 时,情况发生了变化。感谢@cigien 指出。g++ 仍然使用 Apple clang 附带的编译器的默认值。
g++ --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 12.0.0 (clang-1200.0.32.27)
Target: x86_64-apple-darwin20.1.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
解决方案
根据这个答案,您应该使用:(
g++-10 -g -fsanitize=leak -o main main.cpp
在这种情况下(带有标志泄漏)我没有泄漏消息./main
,但它可以编译)那么它应该是:
g++-10 -fsanitize=address -g main.cpp ; ASAN_OPTIONS=detect_leaks=1 ./a.out
并且它可以很好地检测泄漏。
- 请注意,在 MacOS 中 brew 安装 g++ 的正确路径是:
$ which g++-10
> /usr/local/bin/g++-10
--
$ which g++
> /usr/bin/g++ //this is pseudonym of clang
gcc-10 也是如此(10 是我当前的版本。你应该使用你的版本而不是那个)
如果您使用CMakeLists.txt
文件,您将像这样配置它:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=[sanitizer_name] [additional_options] [-g] [-OX]")
# leak sanitizer_name not works for me. should be address
并且应该像这样执行 cmake 命令:
cmake -DCMAKE_C_COMPILER=/usr/local/bin/gcc-10 -DCMAKE_CXX_COMPILER=/usr/local/bin/g++-10 ..
然后ASAN_OPTIONS=detect_leaks=1 ./a.out
请注意,如果您打开*/CMakeFiles/3.18.4/CMakeCXXCompiler.cmake
文件,您将看到编译后的信息,现在它将是 g++。
推荐阅读
- javascript - 如何观察 HTML 类的变化来改变 innerHTML 属性
- python-2.7 - Python中的面积计算
- tensorflow - 使用 Tensorflow 的神经网络成本停滞不前
- split - 使用某个值作为分隔符拆分并移动下一行(python)
- servicestack - 使用带有 ServiceStack.Logging.Serilog 的自定义接收器?
- c++ - 定义带有和不带有 INCLUDED_HEADERNAME_H 的标头有什么区别
- android - 在 Android Studio 中向 TabLayouts 添加图标
- python - 有没有可以用来快速检查库与哪些版本的 Python 兼容的工具?
- python - 散景:连接线图和散点图
- php - 带有日期的for循环的php超时