我有一些Visual C++代碼接收指向緩衝區的指針,需要由我的代碼和該緩衝區的長度來處理數據。由於我的控制之外的錯誤,有時這個指針進入我的代碼未初始化或不適合讀取(即當我嘗試訪問緩衝區中的數據時,它會導致崩潰)。IsBadReadPtr最有效的替代品?
所以,我需要驗證這一點指針在我使用它之前。我不想使用IsBadReadPtr或IsBadWritePtr,因爲每個人都同意他們是越野車。 (谷歌他們的例子。)他們也不是線程安全的 - 這可能不是一個擔心在這種情況下,雖然線程安全的解決方案會很好。
我已經看到了通過使用VirtualQuery完成此操作的網絡建議,或者只是在異常處理程序中執行memcpy。但是,需要完成此項檢查的代碼是時間敏感的,因此我需要進行最有效的檢查,這也是100%有效的。任何想法,將不勝感激。
只是要清楚:我知道最好的做法是隻讀錯誤的指針,讓它引發異常,然後追溯到源代碼並修復實際問題。但是,在這種情況下,壞指針來自我無法控制的Microsoft代碼,所以我必須驗證它們。
請注意,我不關心指出的數據是否有效。我的代碼正在尋找特定的數據模式,如果沒有找到它們,它們會忽略數據。我只是試圖防止在這個數據上運行memcpy時發生的崩潰,並且在memcpy點試圖處理異常將需要更改我的代碼中的十幾個地方(但是如果我有像IsBadReadPtr這樣的東西來調用,我只會必須在一個地方更改代碼)。
你可以發佈一個調用堆棧(一直到main或WinMain)嗎? – MSN 2009-01-30 16:25:56
我在回答中添加了一段:如果您之前觸摸了所有堆棧頁面,也許您可以安全地使用IsBadReadPtr。 – ChrisW 2009-01-30 17:41:08
我不知道,使用VirtualQuery的示例代碼有什麼問題。一個普遍的問題是,即使VirtualQuery認爲內存是好的,另一個線程可能在測試之後但在嘗試讀取之前釋放內存:因此,在給定多線程的情況下,事先對其進行測試並不是... – ChrisW 2009-01-30 20:40:48