【问题标题】:How to use clang's LeakSanitizer on MacOS?如何在 MacOS 上使用 clang 的 LeakSanitizer?
【发布时间】:2020-12-15 05:17:05
【问题描述】:

我是 macOS Big Sur。 AFAIK,Valgrind 还不支持这个操作系统。至少我试过this

经过一番谷歌搜索,我切换到LeakSanitizier 并测试了这段 C 代码:

#include <stdlib.h>
void *p;
int main() {
  p = malloc(7);
  p = 0; // The memory is leaked here.
  return 0;
}

post 指出 macOS 附带的 clang 没有启用 -fsanitize=address 支持。所以我从自制软件安装了clang:

/usr/local/opt/llvm/bin/clang --version
clang version 11.0.0
Target: x86_64-apple-darwin20.1.0
Thread model: posix
InstalledDir: /usr/local/opt/llvm/bin

好的,我们试试吧:

Ancalagon:Codes anta40$ /usr/local/opt/llvm/bin/clang -g -fsanitize=address leak1.c -o leak1
Ancalagon:Codes anta40$ ./leak1
Ancalagon:Codes anta40$

什么都没有发生。也许试试llvm-symbolizer

Ancalagon:Codes anta40$ /usr/local/opt/llvm/bin/llvm-symbolizer ./leak1
./leak1

同样的结果。也许我在这里遗漏了什么?

【问题讨论】:

    标签: macos address-sanitizer leak-sanitizer


    【解决方案1】:

    启用 LeakSanitizer 设置 ASAN_OPTIONS=detect_leaks=1 或使用 -fsanitize=leak 标志。

    另外,根据this,如果使用clang 11.0 版和Xcode 11.3 版,请使用clang-mlinker-version=450 标志以避免链接器错误。

    例子:

    $ /usr/local/opt/llvm/bin/clang -g -fsanitize=address leak1.c -o leak1
    $ ASAN_OPTIONS=detect_leaks=1 ./leak1
    

    $ /usr/local/opt/llvm/bin/clang -g -fsanitize=leak leak1.c -o leak1
    $ ./leak1
    

    【讨论】:

    • 看来我必须同时使用-fsanitize=addressASAN_OPTIONS=detect_leaks=1
    猜你喜欢
    • 2019-04-06
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多