Является ли -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