clang是否支持边界检查?

时间:2014-04-03 03:31:36

标签: clang clang++

如果是这样,我该如何开启?我自己在文档中找不到这个,谷歌没有提供有用的结果

e.g,

int arr[2];
arr[5] = n;  // runtime error

2 个答案:

答案 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]检测为错误。