2011-11-10 84 views
0

我想知道是否有可能使用hook(如Detours)去除任意應用程序中的非確定性。用Detours降低非確定性?

我們可以假定單線程應用程序(忽略由比賽和調度引起的非確定性)。

我的第一個猜測是重寫rand()以便爲任何要求僞隨機數的函數輸出可預測和可重複的輸出,而不管種子如何。

有沒有其他常用的功能,我應該考慮覆蓋?

我知道這裏沒有完美的解決方案,但是對於大多數應用程序來說,它可能會起作用。 另外,如果有另一種方法來解決這個問題,我會很樂意閱讀它。

+0

*請*不要使用Detours。它將刪除的唯一非確定性是應用程序是否會崩潰(它會)。 EasyHook是一個更穩定的替代方案,功能更強大(儘管文檔記錄不佳)。 – ssube

+1

不要忘記使用未初始化的變量/內存(在堆棧或堆中)的錯誤。你可能不會抓住他們。 –

+0

這是不好的?自2009年以來,EasyHook似乎被放棄,而Detours 3於今年發佈。對於那個或者更老的版本,你的經歷是不是很糟糕? – cloudraven

回答

1

您不需要實際刪除rand()和朋友,因爲它們是僞隨機數生成器。對於相同的種子,rand()會得到相同的結果,所以您實際需要捕獲的是用於初始化RNG的調用time()

關鍵的洞察是,非確定性效應主要是由於調度(這對大部分單線程應用程序沒有影響),系統調用的結果和程序中未初始化的內存。您需要控制系統調用的結果來控制程序的輸入。 strace是確定哪些函數調用需要覆蓋的非常好的工具。要檢查是否有未初始化的內存使用,請使用valgrind

+0

謝謝,這很有道理。 – cloudraven