clang支持边界检查吗?

clang支持边界检查吗?,clang,clang++,Clang,Clang++,如果是,如何打开?我自己在文档中找不到这个,谷歌也没有提供有用的结果 e、 g, 对。启用此功能的命令行是-fsanize=address 有关这方面的更多信息,包括预期的减速以及可能出现链接错误的原因,请参阅 请记住,地址消毒器不仅仅对堆栈对象进行边界检查;如果这是您想要的唯一功能,我认为您可以通过额外传递-mllvm-asan stack将其限制为仅执行该功能。有关详细信息,请参阅。否。不幸的是,即使使用-fsanize=address开关,clang也不能防止滥用指向一个对象的指针来访问另

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

e、 g,


对。启用此功能的命令行是
-fsanize=address

有关这方面的更多信息,包括预期的减速以及可能出现链接错误的原因,请参阅


请记住,地址消毒器不仅仅对堆栈对象进行边界检查;如果这是您想要的唯一功能,我认为您可以通过额外传递
-mllvm-asan stack
将其限制为仅执行该功能。有关详细信息,请参阅。

否。不幸的是,即使使用-fsanize=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 1
a[17] = 'B'
使用实边界检查时,应将[17]检测为错误

clang -fsanitize=address badcode.c -o badcode
$ ./badcode 1
a[17] = 'B'