如果是这样,我该如何打开?我在文档中找不到这个信息,谷歌搜索也没有提供有用的结果。
例如:
例如:
int arr[2];
arr[5] = n; // runtime error
是的。启用此功能的命令行为-fsanitize=address
。
更多信息,包括预期的速度降低以及可能出现链接错误的原因,请参见Clang的AddressSanitizer文档。
请注意地址检查器不仅对堆栈对象进行边界检查;如果这是您想要的唯一能力,则可以通过额外传递-mllvm -asan-stack
来限制它仅执行该操作。有关详细信息,请参见地址检查器标志页面。
不幸的是,即使使用-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]检测为错误。