内存越界定位MALLOC_CHECK_

Posted 叮咚咕噜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存越界定位MALLOC_CHECK_相关的知识,希望对你有一定的参考价值。

  • GNU C Library可以根据环境变量MALLOC_CHECK_来决定是否在运行时可检测程序中的内存问题。但是只能检测malloc和free的问题;即便是越界了,也只能等下一次去malloc或者free的时候才能发现。因此只适用于free和malloc的这种死机问题定位。

1、基础

  • MALLOC_CHECK_有三种设定,即:
    • MALLOC_CHECK_=0, 和没设置一样,将忽略这些错误
    • MALLOC_CHECK_=1, 将打印一个错误告警
    • MALLOC_CHECK_=2, 程序将收到SIGABRT信号退出
  • 在将环境该环境变量设为2后,检测到内存使用异常,程序段错误,出现coredump文件
  • 缺点:此方法没有办法检测读越界
  • libc版本太老是不支持的

2、案例1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE 32

int main()
{
	int i;
	char * buf1 = (char*) malloc(BUF_SIZE);

	printf("buf1: [%x] %p\\n", buf1, buf1);

	memset(buf1, 'c', BUF_SIZE);		//此处故意越界访问

	printf("%s:%d buf1: [%x]\\n", __func__, __LINE__, buf1);

	free(buf1);

	char * buf = (char*) malloc(BUF_SIZE);

	printf("buf: [%x] %p\\n", buf, buf);

	for (i = 0; i < BUF_SIZE; i++)
	{
		printf("%2x ", (0xFF & buf[i]));
	}
	
	printf("\\n");

	free(buf);
	
	printf("\\n");

	return 0;
}

运行结果:

1.	/nfs/mstart910 # ./build  
2.	buf1: [f99190] 0xf99190  
3.	main:16 buf1: [f99190]  
4.	buf: [f99190] 0xf99190  
5.	 0  0  0  0  0  0  0  0 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 

执行export MALLOC_CHECK_=2
运行结果2:

1.	/nfs/mstart910 # ./build  
2.	buf1: [1c86008] 0x1c86008  
3.	main:16 buf1: [1c86008]  
4.	free(): invalid pointer  
5.	Aborted  

3、案例2

本案例验证内存越界如果没有踩到mallo和free相关的内容是不会被检测到的

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE 32

int main()
{
	int i;
	char * buf1 = (char*) malloc(BUF_SIZE);

	printf("buf1: [%x] %p\\n", buf1, buf1);

	memset(buf1, 'c', BUF_SIZE);		//此处故意越界访问

	printf("%s:%d buf1: [%x]\\n", __func__, __LINE__, buf1);

	free(buf1);
	
	printf("释放之后访问前\\n");

	*(buf1+10) = 'a';
	
	printf("释放之后访问后\\n");
	
	char * buf = (char*) malloc(BUF_SIZE);

	printf("buf: [%x] %p\\n", buf, buf);

	for (i = 0; i < BUF_SIZE; i++)
	{
		printf("%2x ", (0xFF & buf[i]));
	}
	
	printf("\\n");

	free(buf);
	
	printf("\\n");

	return 0;
}

执行结果:

1.	/nfs/mstart910 # ./build  
2.	buf1: [a07008] 0xa07008  
3.	main:16 buf1: [a07008]  
4.	buf: [a07008] 0xa07008  
5.	 0  0  0  0 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63   
6.	释放之后访问前  
7.	释放之后访问后  

该案例证明,使用了释放之后的内存,只要不影响到内存的malloc和free,MALLOC_CHECK_机制就检测不出来

以上是关于内存越界定位MALLOC_CHECK_的主要内容,如果未能解决你的问题,请参考以下文章

Asan快速定位内存越界内存泄漏

Asan快速定位内存越界内存泄漏

踩内存问题定位手段汇总

内存越界定位magic number

内存越界定位mprotect

随手记——使用GDB定位内存越界问题