2011-01-06 49 views
1

在Unix中是否有類似於IsBadReadPtr的功能?至少IsBadReadPtr的一些功能? 我想編寫一個過程,如果某個進程發生了問題(如SIGSEGV),並會恢復某些信息,該進程會作出反應。但是我想檢查指針以確保數據沒有損壞,並查看它們是否可以安全地訪問。否則,碰撞處理程序本身會崩潰,從而變得毫無用處。Unix上的IsBadReadPtr模擬器

有什麼建議嗎?

+1

[不要使用IsBad * Ptr。](http://blogs.msdn.com/b/oldnewthing/archive/2006/09/27/773741.aspx) – ephemient 2011-01-06 05:03:48

回答

7

在POSIX系統上執行此操作的常用方法是使用write()系統調用。這將返回errnoEFAULT,而不是產生一個信號,如果內存無法讀取可以:

int nullfd = open("/dev/random", O_WRONLY); 

if (write(nullfd, pointer, size) < 0) 
{ 
    /* Not OK */ 
} 
close(nullfd); 

/dev/random是在Linux上使用的一個很好的設備,因爲它可以通過任何用戶都可以寫,將實際嘗試讀取給定的內存。在沒有/dev/random的操作系統或不可寫入的操作系統上,嘗試/dev/null)。另一種選擇是匿名管道,但如果你想測試一個大的區域,你需要定期清除管道的讀取端。

+0

此解決方案在Linux 3.8.7上不起作用... write()如果'fd'爲/ dev/null,即使'pointer'爲NULL,ALWAYS也會返回成功。 – etherice 2013-04-20 18:24:44

1

在Windows或Unix上,您永遠無法判斷「指針是否可以安全訪問」。但是對於一些unix平臺上的一些類似信息,請查看cat /proc/self/maps

+1

如果我在gdb下運行,我可以顯示一個內存位置和gdb會顯示一些東西或告訴我``不能訪問內存在地址等待```。所以它知道我是否可以訪問地址等等 - 我想知道我的程序如何做到這一點。 – StasM 2011-01-06 04:43:15

+0

@StasM:gdb很好的猜測。另外它通過ptrace pokes訪問*另一個*進程中的內存,所以如果它崩潰就沒關係。 – ephemient 2011-01-06 05:05:19

0

你怎麼做到的?

你試着去做,然後處理錯誤。

爲此,首先設置一個sigsetjmp和一個SIGSEGV信號處理程序。然後嘗試使用指針。如果它是一個錯誤的指針,那麼調用SIGSEGV處理程序,您可以跳轉到安全狀態並向用戶報告錯誤。