我想知道是否有可能使用hook(如Detours)去除任意應用程序中的非確定性。用Detours降低非確定性?
我們可以假定單線程應用程序(忽略由比賽和調度引起的非確定性)。
我的第一個猜測是重寫rand()
以便爲任何要求僞隨機數的函數輸出可預測和可重複的輸出,而不管種子如何。
有沒有其他常用的功能,我應該考慮覆蓋?
我知道這裏沒有完美的解決方案,但是對於大多數應用程序來說,它可能會起作用。 另外,如果有另一種方法來解決這個問題,我會很樂意閱讀它。
我想知道是否有可能使用hook(如Detours)去除任意應用程序中的非確定性。用Detours降低非確定性?
我們可以假定單線程應用程序(忽略由比賽和調度引起的非確定性)。
我的第一個猜測是重寫rand()
以便爲任何要求僞隨機數的函數輸出可預測和可重複的輸出,而不管種子如何。
有沒有其他常用的功能,我應該考慮覆蓋?
我知道這裏沒有完美的解決方案,但是對於大多數應用程序來說,它可能會起作用。 另外,如果有另一種方法來解決這個問題,我會很樂意閱讀它。
您不需要實際刪除rand()
和朋友,因爲它們是僞隨機數生成器。對於相同的種子,rand()會得到相同的結果,所以您實際需要捕獲的是用於初始化RNG的調用time()
。
關鍵的洞察是,非確定性效應主要是由於調度(這對大部分單線程應用程序沒有影響),系統調用的結果和程序中未初始化的內存。您需要控制系統調用的結果來控制程序的輸入。 strace
是確定哪些函數調用需要覆蓋的非常好的工具。要檢查是否有未初始化的內存使用,請使用valgrind
。
謝謝,這很有道理。 – cloudraven
*請*不要使用Detours。它將刪除的唯一非確定性是應用程序是否會崩潰(它會)。 EasyHook是一個更穩定的替代方案,功能更強大(儘管文檔記錄不佳)。 – ssube
不要忘記使用未初始化的變量/內存(在堆棧或堆中)的錯誤。你可能不會抓住他們。 –
這是不好的?自2009年以來,EasyHook似乎被放棄,而Detours 3於今年發佈。對於那個或者更老的版本,你的經歷是不是很糟糕? – cloudraven