Должен -fsanitize = address go в CFLAGS или LDFLAGS? - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь использовать очиститель адресов, используя (-fsanitize=address), и я не уверен, относится ли он к CFLAGS или LDFLAGS. На самом деле, кажется, что он работает нормально, когда добавляется только в LDFLAGS, но я не знаю, является ли это совпадением или это должно быть так.

Требуется ли -fsanitize=address для самой компиляции или делает достаточно указать флаг для шага связывания?

1 Ответ

2 голосов
/ 28 марта 2020

Является ли -fsanitize = адрес, необходимый для самой компиляции, или достаточно указать флаг для этапа компоновки?

Address Sanitizer instruments исходный код для вставки дополнительных проверок, и поэтому должен присутствовать во время компиляции.

Если аргумент указывается только в строке ссылки, то asan runtime будет связан с процессом, но проверки на самом деле не выполняются за исключением небольшого подмножества, а именно проверок, достижимых путем вставки new delete, malloc, free и других стандартных функций.

Пример:

     1  #include <malloc.h>
     2  #include <stdio.h>
     3
     4  void fn(int *ip)
     5  {
     6    ip[0] = 1;  // BUG: heap buffer overflow
     7  }
     8
     9  int main()
    10  {
    11    int *ip = malloc(1);   // Allocation too small.
    12    printf("%d\n", ip[0]); // BUG: heap buffer overflow
    13    free(ip);
    14    free(ip);  // BUG: double free
    15  }

Без инструментария обнаруживается только двойное освобождение:

gcc -g -c t.c && gcc -fsanitize=address t.o && ./a.out
190
=================================================================
==55787==ERROR: AddressSanitizer: attempting double-free on 0x602000000010 in thread T0:

С инструментарием: обнаруживается как ошибка в printf, так и ошибка в fn.

gcc -g -c -fsanitize=address t.c && gcc -fsanitize=address t.o && ./a.out
=================================================================
==58202==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000010 at pc 0x564565639252 bp 0x7ffe36b0a560 sp 0x7ffe36b0a558
READ of size 4 at 0x602000000010 thread T0
    #0 0x564565639251 in main /tmp/t.c:12
...