如何在 MacOS 上使用 clang 的 LeakSanitizer?
How to use clang's LeakSanitizer on MacOS?
我是 macOS 大苏尔。据我所知,Valgrind 还不支持这个 OS。至少我试过 this.
谷歌搜索后,我切换到 LeakSanitizier 并测试了这个 C 代码:
#include <stdlib.h>
void *p;
int main() {
p = malloc(7);
p = 0; // The memory is leaked here.
return 0;
}
这 指出 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
同样的结果。也许我在这里遗漏了什么?
要启用 LeakSanitizer,请设置 ASAN_OPTIONS=detect_leaks=1
或使用 -fsanitize=leak
标志。
此外,根据 this,如果使用 clang
11.0 版和 Xcode
11.3 版,请使用带有 -mlinker-version=450
标志的 clang
以避免链接器错误。
示例:
$ /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
我是 macOS 大苏尔。据我所知,Valgrind 还不支持这个 OS。至少我试过 this.
谷歌搜索后,我切换到 LeakSanitizier 并测试了这个 C 代码:
#include <stdlib.h>
void *p;
int main() {
p = malloc(7);
p = 0; // The memory is leaked here.
return 0;
}
这 -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
同样的结果。也许我在这里遗漏了什么?
要启用 LeakSanitizer,请设置 ASAN_OPTIONS=detect_leaks=1
或使用 -fsanitize=leak
标志。
此外,根据 this,如果使用 clang
11.0 版和 Xcode
11.3 版,请使用带有 -mlinker-version=450
标志的 clang
以避免链接器错误。
示例:
$ /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