Подавление AddressSanitizer - PullRequest
       67

Подавление AddressSanitizer

0 голосов
/ 02 октября 2018

Я пытаюсь подавить предупреждение от средства очистки адреса в clang / gcc

Мой исходный файл выглядит так:

int foo(){
  double bar[] = {7,8};
  return bar[3];
}

int main(){
  return foo();
}

и, очевидно, в строке 3 переполнение.

файл подавления (myasan.supp) содержит:

interceptor_via_fun:foo

компиляция (clang также создает предупреждение) и выполнение:

clang -O0 -g -fsanitize=address -fno-omit-frame-pointer sanitizerTest.c
ASAN_SYMBOLIZER_PATH=/software/clang/7.0.0/bin/llvm-symbolizer  ASAN_OPTIONS=suppressions=myasan.supp ./a.out

, но средство для удаления адресов по-прежнемужалуется на переполнение.

==8119==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffeab4e75f8 at pc 0x0000004008bf bp 0x7ffeab4e75b0 sp 0x7ffeab4e75a8
READ of size 8 at 0x7ffeab4e75f8 thread T0
#0 0x4008be in foo() /tmp/asan/sanitizerTest.c:3
#1 0x400919 in main /tmp/asan/sanitizerTest.c:7
#2 0x7f549fbfb82f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
#3 0x400718 in _start (/tmp/asan/a.out+0x400718)

Компилятор clang7.Я также протестировал clang6, gcc7.

Есть идеи, как заставить это работать?

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Документация ASan :

Этот механизм подавления должен использоваться только для подавления проблем во внешнем коде; он не работает с кодом, перекомпилированным с AddressSanitizer.

Необязательно, я думаю, что он работает только через границы общих объектов.

Для подавления в вашем собственном коде добавьте__attribute__((no_sanitize("address"))) к объявлению функции или использовать черный список времени компиляции:

$ cat myasan.blacklist
fun:foo
$ clang -fsanitize=address -fsanitize-blacklist=myasan.blacklist -w sanitizerTest.c
$ ./a.out
$ 
0 голосов
/ 02 октября 2018

Мы иногда видели постоянные ложные срабатывания Address Sanitizer вскоре после запуска, что, по-видимому, и происходит в вашем примере.Они всегда исчезали в конце концов после того, как я выполнил достаточно чистую сборку с унифицированными настройками дезинфицирующего средства (в том числе вручную обнулил каталог зависимостей вне проекта Xcode), поэтому я подозреваю, что проблема связана со связыванием файлов с немного отличающимися настройками дезинфицирующего средства, но я никогда не изолировалэта проблема.(Если настройки достаточно разные, связывание завершается неудачно.)

Кстати, сохранитесь;потребовалось много работы, чтобы заставить дезинфицирующие средства работать в Xcode с нашей существующей сборкой CMake, но они начинают находить ошибки на полезной ранней стадии разработки.

...