在Unix中是否有類似於IsBadReadPtr的功能?至少IsBadReadPtr的一些功能? 我想編寫一個過程,如果某個進程發生了問題(如SIGSEGV
),並會恢復某些信息,該進程會作出反應。但是我想檢查指針以確保數據沒有損壞,並查看它們是否可以安全地訪問。否則,碰撞處理程序本身會崩潰,從而變得毫無用處。Unix上的IsBadReadPtr模擬器
有什麼建議嗎?
在Unix中是否有類似於IsBadReadPtr的功能?至少IsBadReadPtr的一些功能? 我想編寫一個過程,如果某個進程發生了問題(如SIGSEGV
),並會恢復某些信息,該進程會作出反應。但是我想檢查指針以確保數據沒有損壞,並查看它們是否可以安全地訪問。否則,碰撞處理程序本身會崩潰,從而變得毫無用處。Unix上的IsBadReadPtr模擬器
有什麼建議嗎?
在POSIX系統上執行此操作的常用方法是使用write()
系統調用。這將返回errno
EFAULT
,而不是產生一個信號,如果內存無法讀取可以:
int nullfd = open("/dev/random", O_WRONLY);
if (write(nullfd, pointer, size) < 0)
{
/* Not OK */
}
close(nullfd);
(/dev/random
是在Linux上使用的一個很好的設備,因爲它可以通過任何用戶都可以寫,將實際嘗試讀取給定的內存。在沒有/dev/random
的操作系統或不可寫入的操作系統上,嘗試/dev/null
)。另一種選擇是匿名管道,但如果你想測試一個大的區域,你需要定期清除管道的讀取端。
此解決方案在Linux 3.8.7上不起作用... write()如果'fd'爲/ dev/null,即使'pointer'爲NULL,ALWAYS也會返回成功。 – etherice 2013-04-20 18:24:44
你怎麼做到的?
你試着去做,然後處理錯誤。
爲此,首先設置一個sigsetjmp和一個SIGSEGV信號處理程序。然後嘗試使用指針。如果它是一個錯誤的指針,那麼調用SIGSEGV處理程序,您可以跳轉到安全狀態並向用戶報告錯誤。
[不要使用IsBad * Ptr。](http://blogs.msdn.com/b/oldnewthing/archive/2006/09/27/773741.aspx) – ephemient 2011-01-06 05:03:48