程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> c++堆越界檢查范例

c++堆越界檢查范例

編輯:C++入門知識

堆前向後後向越界檢查實例,基本上可以檢測不超過一頁的堆越界非法讀寫錯誤!注意初次申請reservered內存頁時,標示它為不可讀寫,不可執行!

// 越界檢查開關
#define SOULCRYSTAL_BOUNDER_CHECK
// 前向越界檢查開關
//#define FRONT_ACROSS
// 後向越界檢查開關
#define POST_ACROSS
struct tagSoulPig {
tagSoulSpec SoulSpec;
#ifdef SOULCRYSTAL_BOUNDER_CHECK

static size_t Roundup(size_t st,int num=8)
{
return ((st + (num-1)) & ~(num-1));
}

void * operator new ( size_t size )
{
DWORD dwAcSize = 1024* 4 * 2;
PBYTE pStart = (PBYTE)VirtualAlloc(NULL,dwAcSize,MEM_RESERVE,PAGE_NOACCESS);
#ifdef POST_ACROSS
pStart = (PBYTE)VirtualAlloc(pStart,size,MEM_COMMIT,PAGE_READWRITE);
pStart = pStart + 1024* 4 - size;
#elif defined( FRONT_ACROSS )
pStart = (PBYTE)VirtualAlloc(pStart+1024* 4,size,MEM_COMMIT,PAGE_READWRITE);
#endif
return pStart;
}
void operator delete ( void * p )
{
PBYTE pAddr = (PBYTE)p;
#ifdef POST_ACROSS
pAddr -= 1024* 4 - sizeof(tagSoulCrystal);
#elif defined( FRONT_ACROSS )
pAddr -= 1024* 4;
#endif
VirtualFree(pAddr,0,MEM_RELEASE);
}
static void testbounder()
{
tagSoulPig * pTest = new tagSoulPig;
// 正常讀寫
pTest->SoulSpec.dwSoulStrength = 9;
#ifdef POST_ACROSS
// 向後越界
//int a = pTest->SoulSpec.nSoulAttID[20] ;
pTest->SoulSpec.nSoulAttID[20] = 3;
#elif defined(FRONT_ACROSS)
// 向前越界
int a = 20 - 40;
int v = pTest->SoulSpec.nSoulAttID[a] ;
pTest->SoulSpec.nSoulAttID[a] = 3;
#endif
}
#endif // SOULCRYSTAL_BOUNDER_CHECK
};

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved