前言
本次测试包括,检测无误的代码,检测内存泄漏,检测访问越界,检测野指针,检测访问已经释放(已经被free)的内存。
一 安装valgrind
sudo apt install valgrind
二 无错误
#include <stdio.h>
#include <stdlib.h>
#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%d $$ " format "\n" \
,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif
int main(int argc, char **argv){
char *p = (char*)malloc(sizeof(char));
*p = 0x31;
DEBUG_INFO("p = %c", *p);
return 0;
}
测试:
二 malloc内存未释放
注释掉前面代码的free
#include <stdio.h>
#include <stdlib.h>
#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%d $$ " format "\n" \
,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif
int main(int argc, char **argv){
char *p = (char*)malloc(sizeof(char)*10);
*p = 0x31;
DEBUG_INFO("p = %c", *p);
//free(p);
return 0;
}
三 越界访问malloc分配的内存
#include <stdio.h>
#include <stdlib.h>
#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%d $$ " format "\n" \
,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif
int main(int argc, char **argv){
int *p = (int*)malloc(sizeof(int) * 5);
p[6] = 20;
DEBUG_INFO("value = %c", p[6]);
free(p);
return 0;
}
四 使用野指针
#include <stdio.h>
#include <stdlib.h>
#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%d $$ " format "\n" \
,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif
int main(int argc, char **argv){
int index = 100;
char *p ;//= (char*)malloc(sizeof(char)*10);
*(p + index) = 0x31;
DEBUG_INFO("p = %c", *(p + index));
//free(p);
return 0;
}
五 访问已经释放的内存
#include <stdio.h>
#include <stdlib.h>
#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%d $$ " format "\n" \
,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif
int main(int argc, char **argv){
int index = 100;
char *p = (char*)malloc(sizeof(char)*10);
free(p);
*(p + index) = 0x31;
DEBUG_INFO("p = %c", *(p + index));
//free(p);
return 0;
}