Как использовать LeakSanitizer от clang на MacOS?

Я MacOS Big Sur. Насколько я знаю, Valgrind еще не поддерживает эту ОС. По крайней мере, я пробовал это.

После некоторого поиска в Google я переключился на LeakSanitizier и протестировал этот код C:

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

В этом сообщении указано, что для clang, поставляемого с macOS, не включена поддержка -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

Тот же результат. Возможно, я что-то здесь упускаю?


person anta40    schedule 13.12.2020    source источник


Ответы (1)


Чтобы включить LeakSanitizer, установите флаг ASAN_OPTIONS=detect_leaks=1 или используйте флаг -fsanitize=leak.

Кроме того, согласно этому, при использовании 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

or

$ /usr/local/opt/llvm/bin/clang -g -fsanitize=leak leak1.c -o leak1
$ ./leak1
person gbudau    schedule 14.12.2020
comment
Кажется, мне нужно использовать как -fsanitize=address, так и ASAN_OPTIONS=detect_leaks=1 - person anta40; 17.12.2020