asan 使用

9 篇文章 0 订阅

Sanitizer

AddressSanitize

Address Sanitizer (ASan) :用于检测内存使用错误
Leak Sanitizer (LSan) :用于检测内存泄漏
Thread Sanitizer (TSan) :用于检测多线程间的数据竞争和死锁
Memory Sanitizer (MSan) :用于检测使用未初始化内存的行为本次主要分享的是ASan的使用
 

ASAN内存检测-CSDN博客

内存调试神器- ASan详解及实例分析-CSDN博客

https://zhuanlan.zhihu.com/p/703368720

gcc -fsanitize=address -fno-omit-frame-pointer testAsan.c 

set(CMAKE_CXX_FLAGS "-std=c++17 -g -fsanitize=address -fno-omit-frame-pointer") 

./a.out 2> asan_errors_$(date +%Y-%m-%d_%H-%M-%S).txt

export ASAN_OPTIONS=halt_on_error=0 // 配置出错不退出https://blog.csdn.net/qq_40178082/article/details/134824462
  1. -fsanitize=address
    • 用于开启 AddressSanitizer(ASan),该工具可以检测内存相关的错误,如内存泄漏、缓冲区溢出、野指针等。ASan 会在运行时对程序的内存访问进行检查,并输出相应的错误报告。
  2. -fsanitize=leak
    • 专门用于检测内存泄漏问题。虽然 AddressSanitizer 也包含内存泄漏检测功能,但 -fsanitize=leak 选项允许更专注于内存泄漏问题的检测。
  3. -fsanitize=undefined
    • 启用 UndefinedBehaviorSanitizer(UBSan),用于检测未定义行为,如整数溢出、除以零、空指针解引用等。UBSan 可以在运行时检测这些错误,并帮助开发者定位和修复问题。
  4. -fsanitize=thread
    • 启用 ThreadSanitizer(TSan),用于检测多线程程序中的竞态条件和数据竞争。TSan 可以在运行时监控线程间的交互,并报告潜在的竞态问题。
  5. -fsanitize=float-divide-by-zero
    • 检测浮点数除以零的情况。与其他 -fsanitize=undefined 的子选项不同,这个选项需要单独启用。
  6. -fsanitize=float-cast-overflow
    • 检测浮点数到整数的转换是否溢出。这个选项也需要单独启用。
  7. -fsanitize=alignment
    • 检测指针对齐问题。当指针被取消引用时,如果指针没有正确对齐,这个选项会触发错误。
  8. -fsanitize=object-size
    • 使用 __builtin_object_size 函数检测内存引用是否越界。这个选项可以帮助发现指针访问超出其合法范围的问题。
  9. -fsanitize=shift
    • 检测移位操作的结果是否未定义。这个选项有两个子选项 -fsanitize=shift-base 和 -fsanitize=shift-exponent,分别用于检测移位运算的不同方面。
  10. -fsanitize=integer-divide-by-zero
    • 检测整数除以零的未定义行为。这个选项与 -fsanitize=undefined 的一部分功能重叠,但也可以单独启用。
  11. -fsanitize=unreachable
    • 当发生 __builtin_unreachable 调用时,如果代码执行到了标记为不可达的区域,这个选项会触发错误。
  12. -fsanitize=vla-bound
    • 检测可变长度数组(VLA)的大小是否为正。如果 VLA 的大小计算结果为负,这个选项会触发错误。
  13. -fsanitize=null
    • 启用指针检查,特别是检查空指针解引用的问题。
  14. -fsanitize=return
    • 启用返回语句检查。在 C++ 中,这个选项会检查非 void 类型的函数是否在到达末尾时返回了值。
  15. -fsanitize=signed-integer-overflow
    • 检测有符号整数溢出。检查加、乘以及一元和二元减法的结果是否在有符号算术中溢出。

同时开启多个选项
g++ -fsanitize=address,leak -g my_program.cpp -o my_program

asan ,在编译时向程序中插入额外的检查代

Valgrind通过创建虚拟环境来执行被分析的程序,并在这个环境中跟踪每个分配的内存块及其状态

ASan可能导致性能降低约2倍,这比Valgrind快了一个数量级(Valgrind官方给出的数据是性能降低10-20倍)。

valgrind 还有性能分析工具 asan也能排查多线程资源竞争,还可以排查死锁

如果你需要一个更全面的内存检测工具,特别是要检测更广泛的内存管理问题,Valgrind 是一个更好的选择。然而,如果你只需要快速而有效地检测内存访问错误,AddressSanitizer 是一个更轻便的解决方案。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值