Как использовать gcc с fsanitize = address? - PullRequest
1 голос
/ 07 октября 2019

Я пытаюсь научиться использовать -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????????

Что я неправильно понимаю / делаю неправильно?

...