-fsanitize=address 应该进入 CFLAGS 还是 LDFLAGS?
Should -fsanitize=address go into CFLAGS or LDFLAGS?
我正在尝试使用 (-fsanitize=address
) 使用地址清理器,但我不确定它是属于 CFLAGS 还是 LDFLAGS。它实际上只添加到 LDFLAGS 时似乎工作正常,但我不知道这是巧合还是应该是这样。
编译本身是否需要 -fsanitize=address
,或者是否足以为链接步骤提供标志?
Is -fsanitize=address needed for the compilation itself, or does it suffice to provide the flag for the linking step?
Address Sanitizer 工具 源代码 以插入额外的检查,因此必须在编译时存在。
仅在 link 行提供参数会导致 asan runtime 被 link 编辑到进程中,但实际上没有进行任何检查,除了对于一个小子集——即通过插入 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 }
没有检测,只检测到double-free:
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
我正在尝试使用 (-fsanitize=address
) 使用地址清理器,但我不确定它是属于 CFLAGS 还是 LDFLAGS。它实际上只添加到 LDFLAGS 时似乎工作正常,但我不知道这是巧合还是应该是这样。
编译本身是否需要 -fsanitize=address
,或者是否足以为链接步骤提供标志?
Is -fsanitize=address needed for the compilation itself, or does it suffice to provide the flag for the linking step?
Address Sanitizer 工具 源代码 以插入额外的检查,因此必须在编译时存在。
仅在 link 行提供参数会导致 asan runtime 被 link 编辑到进程中,但实际上没有进行任何检查,除了对于一个小子集——即通过插入 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 }
没有检测,只检测到double-free:
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