2012-06-19 37 views
1

用於確定指針(任何類型)是否映射到當前進程的髒竅門是將指針傳遞給access系統調用,然後檢查errno中的EFAULT。另一種是使用munlock並檢查ENOMEM。另一個是解析/proc/PID/maps。有沒有一種副作用少的方法,最好不依賴於procfs?確定指針是否映射到當前進程

+1

我可以問你爲什麼需要這個?你想做什麼? – Wug

+2

是的,聽到他在做什麼會很有趣... –

+0

作爲一個來自不檢查類型或參數數量(如Fortran)的語言的調用者的庫,其中一個最常見的問題是用戶給我們一個糟糕的指針。這通常會導致支持請求,我們會向用戶解釋如何查找和修復代碼中的錯誤。我們希望調試模式能夠執行更精確的檢查,以便更快地發現用戶代碼中的這些錯誤。 (沒有大量的文檔和錯誤消息說使用valgrind似乎能夠說服足夠固執的人。) – Jed

回答

1

檢查指針訪問的方法是簡單地嘗試使用它;如果您無法訪問,您將收到一個SIGSEGV - 您可以使用自己的信號處理程序來捕捉它。

要做到這一點,您需要在訪問指針之前使用setjmp()函數,並且您希望您的信號處理函數爲longjmp()。沿着這些路線的東西:

if (setjmp(jmp_buf)) printf("The pointer was inaccessible.\n"); 
else { 
    int x = *ptr; 
    printf("The pointer was readable.\n"); 
} 

在信號處理程序,你會想:

... 
longjmp(jmp_buf, 1); 

這會導致應用程序恢復在特定點setjmp()功能,在恢復所有寄存器並使函數返回1(而不是其缺省值0)的方式。