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

内存调试神器- ASan详解及实例分析内存调试神器 ASan 详解及实例分析 asan

大家好,欢迎来到IT知识分享网。

ASan,即Address Sanitizer,是一个适用于c/c++程序的动态内存错误检测器,它由一个编译器检测模块(LLVM pass)和一个替换malloc函数的运行时库组成,在性能及检测内存错误方面都优于Valgrind,你值得拥有。

适用平台

强大功能

ASan作为编译器内置功能,支持检测各种内存错误:

如何使用

下面针对内存的几种c/c++常见内存错误,编写例子,看下ASan的检测输出情况:

  • 堆缓冲区溢出
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *heap_buf = (char*)malloc(32*sizeof(char)); memcpy(heap_buf+30, "overflow", 8); //在heap_buf的第30个字节开始,拷贝8个字符 free(heap_buf); return 0; } 

可以看到asan报错:40602ERROR: AddressSanitizer: heap-buffer-overflow on address 0x0 at xxxx,下面也列出了发生heap-buffer-overflow时的调用链及heap buffer在哪里申请的。

  • 栈缓冲区溢出
#include <stdio.h> #include <string.h> int main() { char stack_buf[4] = {0}; strcpy(stack_buf, "1234"); return 0; } 

===========================================================

38634ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffcf3d8b8d4 at pc 0x7f8714bbaa1d bp 0x7ffcf3d8b8a0 sp
0x7ffcf3d8b048 WRITE of size 5 at 0x7ffcf3d8b8d4 thread T0
#0 0x7f8714bbaa1c (/lib64/libasan.so.5+0x40a1c)
#1 0x in main (/root/asan_test/stack_ovf_test+0x)
#2 0x7f87147da872 in __libc_start_main (/lib64/libc.so.6+0x23872)
#3 0x4007cd in _start (/root/asan_test/stack_ovf_test+0x4007cd)




可以看到asan报错:38634ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffcf3d8b8d4 at xxx,发生stack buffer overflow时函数的调用链信息。

  • 使用悬空指针
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *p = (char*)malloc(32*sizeof(char)); free(p); int a = p[1]; return 0; } 
  • 使用栈上返回的变量
#include <stdio.h> #include <stdlib.h> #include <string.h> int *ptr; void get_pointer() { int local[10]; ptr = &local[0]; return; } int main() { get_pointer(); printf("%d\n", *ptr); return 0; } 
  • 使用退出作用域的变量
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int *p; { int num = 10; p = &num; } printf("%d/n", *p); return 0; } 
  • 重复释放
#include <stdio.h> #include <stdlib.h> int main() { char *p = (char*)malloc(32*sizeof(char)); free(p); free(p); return 0; } 
  • 使用退出作用域的内存
#include <stdio.h> #include <stdlib.h> int main() { int *p; { int num = 10; p = &num; } printf("%d/n", *p); return 0; } 
  • 内存泄露检测
#include <stdio.h> #include <stdlib.h> #include <string.h> char* get_systeminfo() { char *p_system = (char*)malloc(38*sizeof(char)); strcpy(p_system, "Linux version 4.18.0-147.el8.x86_64"); return p_system; } int main() { printf("system info:%s", get_systeminfo()); return 0; } 

SUMMARY: AddressSanitizer: 38 byte(s) leaked in 1 allocation(s).

注:内存泄漏检测时,需带上ASAN_OPTIONS=detect_leaks=1参数启程序。

ASan输出格式优化

ASAN_OPTIONS=’stack_trace_format=“[frame=%n, function=%f, location=%S]”’参数启动程序

更多配置参数

  • 编译参数

在这里插入图片描述

  • 运行时参数

查看看所有的运行时参数,可以用ASAN_OPTIONS=help=1启动程序,就会输出所有支持的参数标志:

参考:

https://github.com/google/sanitizers/wiki/AddressSanitizer

https://www.cnblogs.com/king-howe/p/14072200.html

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/111049.html

(0)
上一篇 2026-01-27 15:00
下一篇 2026-01-27 15:16

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信