Я пытаюсь научиться использовать -fsanitize=address -fno-omit-frame-pointer
для обнаружения утечек памяти. Я написал что-то простое, в котором явно есть утечка памяти, но компиляция с gcc -fsanitize=address -fno-omit-frame-pointer file.c
и последующее выполнение функции, похоже, не вызывают проблем.
Этот пост, кажется, указывает на то, что нам нужно установить botthфлаг компилятора и флаг компоновщика и НЕ использовать -lasan
Как использовать AddressSanitizer в 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. Я обновил и обновил gcc с помощью brew. Информация о версии: 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????????
Что я неправильно понимаю / делаю неправильно?