首页 > 解决方案 > 如何解决苹果设备上的“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

标签: c++clang

解决方案


根据这个答案,您应该使用:(
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++。


推荐阅读