内存越界定位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_的主要内容,如果未能解决你的问题,请参考以下文章