当前位置: 首页 > ds >正文

使用 AddressSanitizer 检测栈内存越界错误

一、概述

        在 C/C++ 编程中,栈内存越界 是一种常见而危险的内存错误,通常发生在局部变量数组被访问时索引越界。由于栈空间的结构特点,越界写入可能覆盖返回地址或其他局部变量,导致不可预测的行为甚至程序崩溃。传统的调试手段难以定位此类错误,而 AddressSanitizer(ASan) 提供了一种强大的检测手段。

二、什么是栈内存越界?

栈内存越界通常表现为对局部数组或变量的非法访问:

  • 写入超出数组边界

  • 读取未定义的栈空间

这类错误在编译阶段不会报错,运行阶段也可能不会立刻崩溃,因而很难发现。

三、示例代码

下面是一个典型的栈越界示例:

#include <stdio.h>void stack_overflow_example() {char buffer[10];for (int i = 0; i <= 10; ++i) {  // 注意:i <= 10 会写入 buffer[10],越界!buffer[i] = 'A';}printf("Buffer: %s\n", buffer);
}int main() {stack_overflow_example();return 0;
}

这段代码分配了一个大小为 10 的栈数组 buffer,但循环访问了 11 个元素(下标 0 到 10),导致栈内存越界。

四、使用 ASan 编译和运行

要使用 ASan 检测该问题,请用支持 ASan 的编译器(如 GCC 或 Clang)加上 -fsanitize=address -g 选项进行编译:

clang -fsanitize=address -g stack_overflow.c -o stack_overflow

或者使用 GCC:

gcc -fsanitize=address -g stack_overflow.c -o stack_overflow
运行:
./stack_overflow

五、ASan 报告解读

运行程序后,ASan 会输出类似如下的错误信息:


报告说明:

  • stack-buffer-overflow 表示捕获栈缓冲区溢出错误。

  • WRITE of size 1 at 0x7ffff130b6ba thread T0:越界写入了 1 字节。

  • 0x7ffff130b6ba :发生越界的地址。

  • [32, 42) 'buffer' (line 4) <== Memory access at offset 42 overflows this variable
    buffer
    :显示了哪一个局部变量被越界访问。

  • [32, 42):指出了越界的地方,buffer 占据了栈帧中的offset 32~41 的空间(共10字节)访问 offset 42触发越界。

六、修复建议

将循环条件修正为:

for (int i = 0; i < 10; ++i)

避免越界访问

buffer[10]

七、总结

  • 栈内存越界是一种常见的低级错误,极易引发程序崩溃或漏洞。

  • AddressSanitizer 提供了即时、高精度的栈越界检测功能,是定位此类错误的利器。

  • 养成使用 -fsanitize=address 编译调试程序的习惯,有助于在开发阶段及时发现问题。

http://www.xdnf.cn/news/5887.html

相关文章:

  • 如何配置本机host文件
  • Power BI 实操案例,将度量值转化为切片器(动态切换分析指标)
  • 在Text-to-SQL任务中应用过程奖励模型
  • 【Python】Python常用数据类型详解
  • cursor 如何在项目内自动创建规则
  • uniapp-商城-54-后台 新增商品(页面布局)
  • Linux异步通知机制详解
  • TongWeb7.0常用-D参数说明
  • python标准库--sys - 系统相关功能在算法比赛的应用
  • 无人机信号线被电磁干扰导致停机
  • mplayer使用详解
  • JDK 安装与配置
  • 实数完备性定理互证2
  • 【蓝桥杯嵌入式】【模块】一、系统初始化
  • okhttp3.Interceptor简介-笔记
  • 【PXIE301-211】基于PXIE总线的16路并行LVDS数据采集、1路光纤数据收发处理平台
  • [Java][Leetcode simple] 189. 轮转数组
  • 前端-高德地图选点带搜索功能
  • hashicorp raft源码分析(一、项目介绍与Leder选举实现)
  • 猫咪如厕检测与分类识别系统系列~进阶【三】网页端算法启动架构及数据库实现
  • YOLOv5推理代码解析
  • 医院陪护服务革新:透明化监护与即时救济机制构建
  • 如何优雅的使用CMake中的FindPkgConfig模块
  • 验证回文串1
  • Linux sysvinit 系统启动
  • 【三】 空域滤波的基础与空域中的低通滤波器(2)【830数字图像处理】
  • 解构赋值
  • RuoYi 中使用 PageUtils.startPage() 实现分页查询的完整解析
  • 数字ic后端设计从入门到精通4(含fusion compiler, tcl教学)CMOS VLSI Design
  • Baumer工业相机堡盟工业相机的工业视觉是否可以在室外可以做视觉检测项目