clang是否支持边界检查?

11
如果是这样,我该如何打开?我在文档中找不到这个信息,谷歌搜索也没有提供有用的结果。
例如:
int arr[2];
arr[5] = n;  // runtime error
2个回答

11

是的。启用此功能的命令行为-fsanitize=address

更多信息,包括预期的速度降低以及可能出现链接错误的原因,请参见Clang的AddressSanitizer文档

请注意地址检查器不仅对堆栈对象进行边界检查;如果这是您想要的唯一能力,则可以通过额外传递-mllvm -asan-stack来限制它仅执行该操作。有关详细信息,请参见地址检查器标志页面


4

不幸的是,即使使用-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]检测为错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接