#ifndef _checkmemoverflow_h_
#define _checkmemoverflow_h_
#define check_mem_overflow
#ifdef check_mem_overflow
//作業系統記憶體分配粒度為頁面(4k)
#define page_size 4096
#define platform_win32
#ifdef platform_win32
#include
#include
/** ooooooooooooo | *******
* (*)acture memory pages | protect page
*/inline
void
*operator
new(size_t size)
void
*p =
virtualalloc
(null
,page_num*page_size+
1,mem_commit,page_readwrite)
;void
*pchecker =
(char
*)p + page_num*page_size;
dword old_value;
virtualprotect
(pchecker,page_size,page_noaccess,
&old_value)
;return
(char
*)p + offset;
}inline
void
operator
delete
(void
*p)#else
#include
#include
#include
/** ********* |ooooooooooooooooooooo | ***********
* size page |(*)acture memory pages | protect page
*///gcc : connot be inline
void
*operator
new(size_t size)
void
operator
delete
(void
*p)#endif
#endif
//#define test_overflow
#ifdef test_overflow
#include
intmain
(int argc,
char
*ar**)
#endif
#endif
原理:
1,過載全域性new/delete,接管記憶體申請/釋放;
2.a,在windows下,頁面最小分配單位為4k,呼叫virtualalloc分配記憶體,並在最後乙個頁面後面新增乙個「哨兵」頁面,頁面屬性為noaccess,讀寫該頁面均crash;
2.b,在linux下,原理同上,但必須在申請的記憶體前面多申請乙個頁面儲存申請的頁面數;
注意:只能在c++中使用,windows/mac下測試通過。
使用方法:
只要include這個標頭檔案即可,且記憶體必須是new出來的,而非malloc的。
參考:1,
2,
mysql 記憶體越界 strncpy越界
strncpy dest,src,n 似乎是安全的函式 原型 char strncpy char restrict s1,const char restrict s2,size t n 今天碰到了問題,是由於對strncpy理解不夠造成的 man裡 事實上s2往往不如n那麼長,於是s1剩餘部分會全填...
記憶體訪問越界
1.記憶體越界分配的原理 何謂記憶體訪問越界,簡單的說,你向系統申請了一塊記憶體,在使用這塊記憶體的時候,超出了你申請的範圍。例如,你明明申請的是100位元組的空間,但是你由於某種原因寫入了120位元組,這就是記憶體訪問越界。記憶體訪問越界的後果是 你的寫入破壞了本不屬於你的空間。如下所示的 輸出 ...
char陣列記憶體越界
在c語言中,將字串作為字元陣列來處理 c 中不是 為了測定字串的實際長度,c語言規定了乙個 字串結束標誌 以字元 0 代表。如果有乙個字串,其中第10個字元為 0 則此字串的有效字元為9個。也就是說,在遇到第乙個字元 0 時,表示字串結束,由它前面的字元組成字串。系統對字串常量也自動加乙個 0 作為...