You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Address Sanitizer未检测到数组越界问题求助

为什么Address Sanitizer未检测到此次数组越界?

你的代码确实存在数组越界访问,但Address Sanitizer(ASAN)没触发告警,核心原因是栈内存的检测机制限制,具体来说:

  • ASAN对栈内存的块级标记:ASAN会将栈内存划分为以16字节为单位的内存块,每个块对应影子内存中的一个标记位,用来标识该块是否可访问。你的数组array是30个int(共120字节),越界访问array[179]对应的偏移是179*4=716字节,这个位置刚好落在栈帧内未被标记为“不可访问”的区域里——比如栈上存储argc、argv的空间,或者栈帧预留的额外空间,这些区域在ASAN的影子内存中被标记为合法,所以不会触发检测。

  • 栈红区的位置:ASAN会在栈帧的末尾设置红区(不可访问内存),但你的越界访问还没触及到这个红区。如果把索引改成更大的值(比如array[1000]),访问就会跨越到红区,ASAN就会立刻触发崩溃并输出详细的越界信息。

  • 编译优化的影响:如果编译时开启了优化(比如默认的-O1),编译器可能会调整栈内存布局,让越界访问更难触及红区。你可以尝试加上-O0参数关闭优化,再测试不同的越界索引,更容易触发ASAN的检测。

附上你的测试代码和编译运行过程:

测试代码

#include <stdio.h>
int main(int argc, char **argv)
{
    int array[30]={0};
    (void) printf("%d\n", array[179]); // <--- 理应触发崩溃,对吗?    
    return 0;
}

编译运行命令

$ gcc -c main.c -fsanitize=address -o main.o
$ gcc main.o -fsanitize=address -o main
$ ./main
32765

内容的提问来源于stack exchange,提问作者OrenIshShalom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 14:01:40