code_test.h
/*
* code_test.h
*
* Created on: 2013-3-28
* Author: hp
*/
#ifndef CODE_TEST_H_
#define CODE_TEST_H_
#include <map>
#include "windef.h"
using namespace std;
struct ALLOC_INFO{
DWORD address;
DWORD size;
char file[64];
DWORD line;
};
class MyTestMalloc
{
public:
static void CoutResult();
static void AddTrack(DWORD addr, DWORD asize, const char *fname,
DWORD lnum);
static void RemoveTrack(DWORD addr, const char *fname, DWORD lnum);
static int malloc_free_sub;
static map<DWORD, ALLOC_INFO>* alloc_map;
};
//Redefined functions
void* mallocb(size_t size, const char* pszFile, int nLine);
void* reallocb(void* memblock, size_t size, const char* pszFile, int nLine);
void* callocb(size_t num, size_t size, const char* pszFile, int nLine);
char* strdupb(const char* chs, const char* pszFile, int nLine);
void freeb(void* memblock, const char* pszFile, int nLine);
//For C++
void* operator new(size_t size, const char* pszFile, int nLine);
void* operator new[](size_t size, const char* pszFile, int nLine);
void operator delete(void* memblock) throw();
void operator delete[](void* memblock) throw();
#endif /* CODE_TEST_H_ */
detect.h
#ifndef DETECT_H
#define DETECT_H
#ifdef __QX_DEBUG_CODE_TEST__
#include "code_test.h"
//Redefine new and delete
#define new new(__FILE__, __LINE__)
//Redefines
#define malloc(size) mallocb(size, __FILE__, __LINE__)
#define realloc(memblock, size) reallocb(memblock, size, __FILE__, __LINE__)
#define calloc(num, size) callocb(num, size, __FILE__, __LINE__)
#define strdup(ch) strdupb(chs, __FILE__, __LINE__)
#define free(memblock) freeb(memblock, __FILE__, __LINE__)
#endif
#endif
code_test.cpp
/*
* code_test.cpp
*
* Created on: 2013-3-28
* Author: hp
*/
#include "code_test/code_test.h"
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int MyTestMalloc::malloc_free_sub = 0;
map<DWORD, ALLOC_INFO>* MyTestMalloc::alloc_map = 0;
void MyTestMalloc::AddTrack(DWORD addr, DWORD asize, const char *fname, DWORD lnum)
{
MyTestMalloc::malloc_free_sub++;
if (!MyTestMalloc::alloc_map)
{
MyTestMalloc::alloc_map = new map<DWORD, ALLOC_INFO>;
}
ALLOC_INFO info;
memset(&info, 0, sizeof(info));
info.address = addr;
strncpy(info.file, fname, 63);
info.line = lnum;
info.size = asize;
MyTestMalloc::alloc_map->insert(make_pair(addr, info));
}
void MyTestMalloc::RemoveTrack(DWORD addr, const char *fname, DWORD lnum)
{
//printf("size:%d\n", MyTestMalloc::alloc_map->size());
if (MyTestMalloc::alloc_map->size() == 0)
{
return;
}
size_t t = MyTestMalloc::alloc_map->erase(addr);
if(t == 1)
{
MyTestMalloc::malloc_free_sub--;
}
}
void MyTestMalloc::CoutResult()
{
printf("\n---------check memory-------------------------------------- \n");
printf("malloc_free_sub:%d\n", malloc_free_sub);
DWORD totalSize = 0;
char buf[128];
map<DWORD, ALLOC_INFO>::iterator iter = MyTestMalloc::alloc_map->begin();
for (; iter != MyTestMalloc::alloc_map->end(); iter++)
{
memset(buf, 0, 128);
sprintf(buf, "%s\t line:%ld\t address:%ld\t unfreed:%ld ", iter->second.file,
iter->second.line, iter->second.address, iter->second.size);
printf(buf);
totalSize += iter->second.size;
}
memset(buf, 0, 128);
sprintf(buf, "\n\nTotal Unfreed: %ld bytes ", totalSize);
printf(buf);
printf("\n-----------------------------------------------------------\n");
if(MyTestMalloc::alloc_map)
{
delete MyTestMalloc::alloc_map;
}
}
void* mallocb(size_t size, const char *pszFile, int nLine)
{
void* ptr = malloc(size);
MyTestMalloc::AddTrack((DWORD)ptr, size, pszFile, nLine);
return ptr;
}
void* reallocb(void *memblock, size_t size, const char *pszFile, int nLine)
{
void * ptr;
ptr = realloc(memblock, size);
MyTestMalloc::RemoveTrack((DWORD)memblock, pszFile, nLine);
MyTestMalloc::AddTrack((DWORD)ptr, size, pszFile, nLine);
return ptr;
}
void* callocb(size_t num, size_t size, const char *pszFile, int nLine)
{
void* ptr = calloc(num, size);
MyTestMalloc::AddTrack((DWORD)ptr, size, pszFile, nLine);
return ptr;
}
char* strdupb(const char* chs, const char* pszFile, int nLine)
{
char* ptr = strdup(chs);
MyTestMalloc::AddTrack((DWORD)ptr, strlen((char*)chs), pszFile, nLine);
return ptr;
}
void freeb(void *memblock, const char *pszFile, int nLine)
{
MyTestMalloc::RemoveTrack((DWORD)memblock, pszFile, nLine);
free(memblock);
}
void pre_delete(const char* pszFile, int nLine)
{
}
void* operator new(size_t size, const char* pszFile, int nLine)
{
void* ptr = malloc(size);
MyTestMalloc::AddTrack((DWORD)ptr, size, pszFile, nLine);
return ptr;
}
void* operator new[](size_t size, const char* pszFile, int nLine)
{
void * ptr = malloc(size);
MyTestMalloc::AddTrack((DWORD)ptr, size, pszFile, nLine);
return ptr;
}
void operator delete(void* memblock) throw()
{
if (memblock)
{
MyTestMalloc::RemoveTrack((DWORD)memblock, "", -1);
}
free(memblock);
}
void operator delete[](void* memblock) throw()
{
if (memblock)
{
MyTestMalloc::RemoveTrack((DWORD)memblock, "", -1);
}
free(memblock);
}