ASan需同时加-fsanitize=address和-g才能有效检测越界并定位源码行;建议配-O1优化,heap/stack/global-buffer-overflow分别对应堆、栈、全局内存越界,报错位置未必是bug根源。

编译时必须加 -fsanitize=address 和 -g
不加 -fsanitize=address 就根本不会插桩,所有越界访问都静默通过;不加 -g 会导致错误报告里只有地址和偏移,没有文件名和行号,等于白跑。Clang 或 GCC 都支持,但 GCC 7+ / Clang 3.4+ 才稳定。建议搭配 -O1 而非 -O0:前者能保留足够优化又不影响报错位置精度,后者反而可能因取消内联导致调用栈失真。
heap-buffer-overflow 和 stack-buffer-overflow 的区别要看分配方式
ASan 报错类型直接对应内存来源:heap-buffer-overflow 指 new / malloc 分配的堆内存越界;stack-buffer-overflow 是局部数组(比如 int buf[10])写超了。两者在报告里都会标出“越界多少字节”和“红区(redzone)位置”,但修复方式不同:堆越界要检查 strlen + 1、memcpy 长度参数;栈越界则得改数组大小或加边界判断。注意:全局数组越界会报 global-buffer-overflow,别漏看。
运行时报错停在哪一行,不等于 bug 就在那一行
越界读写常是“延迟暴露”的——比如指针被算错后存下来,几层函数调用后才解引用。ASan 报告里的第一帧(#0)是非法访问点,但真正出问题的可能是 #2 或 #3 帧里的分配或计算逻辑。常见陷阱包括:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 用
sizeof(arr)算动态数组长度(实际只返回指针大小) - 循环条件写成
i 而非 <code>i - 从
std::vector::data()取裸指针后,没同步更新 size - 结构体填充(padding)导致 memcpy 覆盖相邻字段
检测栈溢出必须关掉 -fomit-frame-pointer
默认开启的 -fomit-frame-pointer 会让 ASan 无法还原完整调用栈,尤其对栈缓冲区溢出,可能只显示 ?? 地址。务必显式加 -fno-omit-frame-pointer。验证方法:运行一个已知栈越界程序,看报告里是否有清晰的函数名和文件行号。如果还报不全,再补上 ASAN_OPTIONS=abort_on_error=1 强制中断,配合 gdb ./a.out 进去查寄存器和栈帧。
立即学习“C++免费学习笔记(深入)”;

















