0

我想知道是否可以使用挂钩(如 Detours)来消除任意应用程序中的不确定性。

我们可以假设单线程应用程序(忽略由竞争和调度引起的不确定性)。

我的第一个猜测是重写rand(),以便为任何要求伪随机数的函数提供可预测和可重复的输出,而不管种子如何。

是否有任何其他常用功能我应该考虑覆盖?

我知道这里没有完美的解决方案,但适用于大多数应用程序的解决方案可能会做到。此外,如果有另一种方法可以解决这个问题,我会很感兴趣地阅读它。

4

1 回答 1

1

您不需要实际删除rand()和朋友,因为它们是伪随机数生成器。对于相同的种子, rand() 将产生相同的结果,因此您实际需要捕获的time()是用于初始化 RNG 的调用。

关键的见解是,非确定性影响的发生主要是由于调度(这对大部分单线程应用程序没有影响)、系统调用的结果和程序中未初始化的内存。您需要控制系统调用的结果来控制程序的输入。strace是一个非常好的工具,用于确定哪些函数调用需要覆盖。要检查是否有未初始化的内存被使用,请使用valgrind.

于 2011-11-10T08:45:32.700 回答