2011-11-10 8 views
0

私は任意のアプリケーションで非決定論を取り除くためにフック(Detoursのような)を使用することが可能かどうか疑問に思っていました。Detoursでの非決定性の低減?

(レースとスケジューリングによる非決定性を無視する)シングルスレッドアプリケーションを想定することができます。

私が最初に推測したのは、シードにかかわらず、擬似乱数を求めている任意の関数に対して予測可能で再現可能な出力を得るためにrand()をオーバーライドすることでした。

オーバーライドする必要がある他の一般的な機能はありますか?

私はここに完璧な解決策はないと知っていますが、ほとんどのアプリケーションでうまくいくでしょう。 また、この問題を解決する別の方法がある場合、私はそれについて読むことに興味があります。

+0

* Detoursは使用しないでください。削除される唯一の非決定論は、アプリケーションがクラッシュするかどうかです(それが起こるかどうか)。 EasyHookははるかに安定した代替品で、もう少し機能的です(文書化されていませんが)。 – ssube

+1

初期化されていない変数/メモリ(スタックまたはヒープ上)を使用するなどのバグを忘れないでください。あなたはおそらくそれらをキャッチしません。 –

+0

それは悪いですか? EasyHookは2009年から放棄されたようだが、Detours 3は今年リリースされた。その1つまたはそれ以上のバージョンのあなたの悪い経験はありましたか? – cloudraven

答えて

1

rand()と友人は擬似乱数ジェネレータなので実際に削除する必要はありません。同じ種子の場合、rand()は同じ結果を返すので、実際に捕捉する必要があるのは、RNGを初期化するために使用されるtime()への呼び出しです。

重要な洞察は、非決定論的な影響は、主にスケジューリング(シングルスレッドアプリケーションの大部分に影響を与えない)、プログラム内のシステムコールと初期化されていないメモリの結果に起因することです。プログラムの入力を制御するためにシステムコールの結果を制御する必要があります。 straceは、どの関数呼び出しを上書きする必要があるかを判断するための非常に優れたツールです。初期化されていないメモリが使用されているかどうかを確認するには、valgrindを使用します。

+0

ありがとう、それは多くの意味があります。 – cloudraven

関連する問題