如果是这样,我该如何开启?我自己在文档中找不到这个,谷歌没有提供有用的结果
e.g,
int arr[2];
arr[5] = n; // runtime error
答案 0 :(得分:11)
是。启用此功能的命令行是-fsanitize=address
。
有关此问题的详细信息,包括预期的减速以及可能会出现链接错误的原因,请参阅Clang's AddressSanitizer Documentation。
请记住,地址清理程序不仅限于检查堆栈对象;如果这是你想要的唯一功能,我认为你可以通过额外传递-mllvm -asan-stack
来限制它。有关详细信息,请参阅this page on address sanitizer flags。
答案 1 :(得分:0)
不。不幸的是,即使使用-fsanitize = address开关,clang也不会阻止滥用指向一个对象的指针来访问另一个对象的数据。考虑以下代码:
#include <stdio.h>
int main(int argc, char **argv)
{
char a[4] = "123";
char b[4] = "ABC";
int i, k;
sscanf(argv[1], "%d", &i);
k = i + (&b[i] - &a[i]);
printf("a[%d] = '%c'\n", k, a[k]);
return 0;
}
将其保存为badcode.c并按以下方式进行编译:
clang -fsanitize=address badcode.c -o badcode
示例运行的输出:
$ ./badcode 1
a[17] = 'B'
通过实边界检查,应将a [17]检测为错误。