我正在尝试学习如何使用-fsanitize=address -fno-omit-frame-pointer
检测内存泄漏。我写了一些简单的东西,显然其中有内存泄漏,但是用gcc -fsanitize=address -fno-omit-frame-pointer file.c
进行编译然后执行该函数似乎没有问题。
这篇文章似乎表明我们需要在底部设置编译器标志和链接器标志,而不要使用-lasan
How to use AddressSanitizer in gcc?。
我认为没有必要,但是我尝试了gcc -fsanitize=address -static-libasan -fno-omit-frame-pointer s.c
,因为文档似乎在这里提到了。 https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html
我还尝试了以下操作:https://lemire.me/blog/2016/04/20/no-more-leaks-with-sanitize-flags-in-gcc-and-clang/
只要有必要,我就使用MacOS。我已经通过brew更新和升级了gcc。版本信息是:
Apple LLVM version 10.0.1 (clang-1001.0.46.4)
这是我写的虚拟代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
char *buffer = malloc(1024);
sprintf(buffer, "%d", argc);
printf("%s\n", buffer);
buffer = malloc(10);
buffer[0] = 'A';
buffer[9] = '\0';
printf("%s\n", buffer);
}
我从来没有释放过任何东西,所以我希望地址清理器能够捕获它。但是当我运行代码时,我得到以下信息:
$ ./s
1
A????????
我误解/做错了什么?