• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

               C++ 技術(shù)中心

               :: 首頁 :: 聯(lián)系 ::  :: 管理
              160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

            公告

            鄭重聲明:本BLOG所發(fā)表的原創(chuàng)文章,作者保留一切權(quán)利。必須經(jīng)過作者本人同意后方可轉(zhuǎn)載,并注名作者(天空)和出處(CppBlog.com)。作者Email:coder@luckcoder.com

            留言簿(27)

            搜索

            •  

            最新隨筆

            最新評論

            評論排行榜

            #ifndef _CHECKMEMOVERFLOW_H_
            #define _CHECKMEMOVERFLOW_H_

            #define CHECK_MEM_OVERFLOW

            #ifdef CHECK_MEM_OVERFLOW
            //操作系統(tǒng)內(nèi)存分配粒度為頁面(4K)
            #define PAGE_SIZE 4096

            #define PLATFORM_WIN32
            #ifdef PLATFORM_WIN32
            #include <stdlib.h>
            #include <windows.h>
            /*
            *        ooooooooooooo      |  *******
            (*)acture memory pages   |  protect page
            */
            inline void * operator new (size_t size)
            {
                size_t page_num = (size_t)(size / PAGE_SIZE);
                size_t offset = 0;
                if(0 != (size % PAGE_SIZE))
                {
                    page_num++;
                    offset = PAGE_SIZE - size % PAGE_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)
            {
                void* address = (char *)p - (size_t)(p) % PAGE_SIZE;
                VirtualFree(address,0,MEM_RELEASE);
            }
            #else
            #include <stdlib.h>
            #include <sys/mman.h>
            #include <stdio.h>
            /*
            * ********* |ooooooooooooooooooooo    |  ***********
            * size page |(*)acture memory pages   |  protect page
            */
            //gcc : connot be inline
            void * operator new (size_t size)
            {
                //calc page num and offset
                int page_num = (int)(size / PAGE_SIZE + 1);
                size_t offset = page_num * PAGE_SIZE - size;

                //alloc memory pages
                void *p = mmap(NULL,page_num*PAGE_SIZE+2,PROT_READ|PROT_WRITE,MAP_PRIVATE | MAP_ANON, -1, 0);

                //saved page num
                size_t* pSize = (size_t*)((char*)p+PAGE_SIZE-sizeof(size_t));
                *pSize = page_num+2;
                mprotect(p, PAGE_SIZE, PROT_NONE);

                //set memory overflow protect page
                void *pchecker = (char*)p + page_num*PAGE_SIZE;
                mprotect(pchecker, PAGE_SIZE, PROT_NONE);

                return (char *)p + offset;
            }
            void operator delete(void *p)
            {
                //calc acture memory page start address
                void* address = (char *)p - (size_t)p % PAGE_SIZE;
                
                mprotect((char*)address-PAGE_SIZE, PAGE_SIZE, PROT_READ);
                size_t pagenum = (size_t)*((char*)address-sizeof(size_t));

                munmap((char*)address-PAGE_SIZE, pagenum*PAGE_SIZE);
            }
            #endif


            #endif

            //#define TEST_OVERFLOW
            #ifdef TEST_OVERFLOW

            #include <stdio.h>
            int main(int argc,char *argv[])
            {
                printf("test start\n");
                char * a = new char[12340];
                printf("%c\n",a[12340]); //程序運行到這里將出現(xiàn)debug中斷
                delete[] a;
                printf("test done\n");
                return 0;
            }
            #endif
            #endif


            原理:

            1,重載全局new/delete,接管內(nèi)存申請/釋放;

            2.a,在windows下,頁面最小分配單位為4K,調(diào)用VirtualAlloc分配內(nèi)存,并在最后一個頁面后面添加一個“哨兵”頁面,頁面屬性為NOACCESS,讀寫該頁面均crash;

            2.b,在linux下,原理同上,但必須在申請的內(nèi)存前面多申請一個頁面保存申請的頁面數(shù);


            注意:

            只能在C++中使用,windows/mac下測試通過。


            使用方法:

            只要include這個頭文件即可,且內(nèi)存必須是new出來的,而非malloc的。

            參考:

            1,http://www.wangchao.net.cn/bbsdetail_65784.html

            2,http://blog.csdn.net/cjfeii/article/details/9122279

            posted on 2014-08-22 16:53 C++技術(shù)中心 閱讀(1582) 評論(0)  編輯 收藏 引用 所屬分類: C++ STL
            久久99国产精品一区二区| 一本久道久久综合狠狠躁AV| 亚洲AV日韩精品久久久久久| 久久精品国产亚洲AV香蕉| 久久国产精品99国产精| 国产精品综合久久第一页| 欧美国产成人久久精品| 久久亚洲春色中文字幕久久久| 久久久久久久99精品免费观看| 色8激情欧美成人久久综合电| 777午夜精品久久av蜜臀| 亚洲嫩草影院久久精品| 久久妇女高潮几次MBA| 狠狠色伊人久久精品综合网| 国产美女亚洲精品久久久综合| 国产欧美久久久精品| 久久久久人妻一区二区三区 | 久久精品国产一区二区电影| 精品国产日韩久久亚洲| 99久久精品免费| 东京热TOKYO综合久久精品| 久久亚洲精品国产亚洲老地址| 久久福利青草精品资源站免费| 无码久久精品国产亚洲Av影片| 青春久久| 亚洲国产成人精品无码久久久久久综合 | 久久亚洲sm情趣捆绑调教| 久久久WWW成人| 国产精品gz久久久| 91久久精品电影| 久久香蕉综合色一综合色88| 亚洲精品午夜国产VA久久成人| 久久影院久久香蕉国产线看观看| 99久久国产综合精品网成人影院| 久久九九有精品国产23百花影院| 99久久精品影院老鸭窝| 精品久久久久久无码专区不卡| 久久综合综合久久综合| 久久精品www人人爽人人| 久久亚洲精精品中文字幕| av国内精品久久久久影院|