[C++]運行時,如何確保一個對象是唯讀

來源:互聯網
上載者:User

相信很多人碰到過一個問題,就是代碼太多了,不知道在哪裡把這個對象給修改掉了.這個其實有兩種辦法的.

1. 在調試的時候,可以下資料斷點.

  gdb有watch斷點.比如gdb>watch *(int*)0x12433,要記住,如果想要一隻監視這個資料,就要用地址,否則過了這個scope,資料斷點就無效了,還有就是,監視的值如果用內建資料類型可以表達的話,是有硬體斷點的,否則效率茫茫低.....

2. 啟動並執行時候,本文主要講這個.

  先來回顧一下,我們都知道一個exec,都有好幾個段,比如程式碼片段,資料區段等.這些段是有讀寫屬性的,例如程式碼片段只可以讀,棧段是可以讀寫~~.那麼我們就想把一個對象塞到一個不可以寫的段裡面,比如.text段....(事實上,我塞進去過,只不過會有警告)

  這個異常暴力,而且預留餘地太小,不太適合.

  現在作業系統都是段模式+分頁模式來管理記憶體的.段模式走不通,換頁模式,找個辦法設定記憶體頁的屬性~~.

  非常幸運,Linux下面有mprotect系統調用,可以運行時設定記憶體頁的讀寫屬性,唯一的要求是記憶體需要4K對齊,浪費了一點.

  OK,讓我們來看mprotect的man page:http://linux.die.net/man/2/mprotect

  簽名很簡答:int mprotect(const void *addr, size_t len, int prot);

  一個地址,一個記憶體的長度,另外就是讀寫屬性,返回調用的結果,成功返回0,失敗返回其他數字.

  順便看看man page中的例子,裡面有一個技巧,就是搞到一個4K對齊的記憶體~~ 通過 ( ptr + 4096 - 1 ) & ~(4096 - 1)搞到的

  

#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <sys/mman.h>#include <limits.h>    /* for PAGESIZE */#ifndef PAGESIZE#define PAGESIZE 4096#endifintmain(void){    char *p;    char c;    /* Allocate a buffer; it will have the default       protection of PROT_READ|PROT_WRITE. */    p = malloc(1024+PAGESIZE-1);    if (!p) {        perror("Couldn't malloc(1024)");        exit(errno);    }    /* Align to a multiple of PAGESIZE, assumed to be a power of two */    p = (char *)(((int) p + PAGESIZE-1) & ~(PAGESIZE-1));    c = p[666];         /* Read; ok */    p[666] = 42;        /* Write; ok */    /* Mark the buffer read-only. */    if (mprotect(p, 1024, PROT_READ)) {        perror("Couldn't mprotect");        exit(errno);    }    c = p[666];         /* Read; ok */    p[666] = 42;        /* Write; program dies on SIGSEGV */    exit(0);}

至此,我們就可以運行時,保證一個對象不可以寫,寫的話,core掉:-D

PS:

希望windows下也有類似的系統調用,Windows下有VirtualProtect,有興趣的朋友研究一下

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.