2011-11-10 3 views
0

임의의 응용 프로그램에서 비 결정 성을 제거하기 위해 후크 (Detours와 같은)를 사용할 수 있는지 궁금합니다.Detours를 사용하여 비 결정 성을 감소 시키시겠습니까?

우리는 단일 스레드 응용 프로그램을 가정 할 수 있습니다 (경쟁 및 스케줄링으로 인한 비 결정 성을 무시할 수 있음).

시드에 관계없이 의사 난수를 요구하는 함수에 대해 예측 가능하고 반복 가능한 출력을 얻으려면 내 첫 번째 추측은 rand()을 무시하는 것이 었습니다.

재정의를 고려해야하는 다른 자주 사용되는 기능이 있습니까?

여기에 완벽한 해결책이 없다는 것을 알고 있지만 대부분의 응용 프로그램에서 제대로 작동하는 것으로 알고 있습니다. 또한이 문제를 해결할 다른 방법이 있다면 그것에 대해 읽는 것이 재미있을 것입니다.

+0

* Detours를 사용하지 마십시오. 제거되지 않는 유일한 비 결정론은 앱의 충돌 여부입니다. EasyHook은 훨씬 더 안정적인 대안이며 좀 더 기능적입니다 (제대로 설명되지는 않았지만). – ssube

+1

초기화되지 않은 변수/메모리 (스택 또는 힙) 사용과 같은 버그는 잊지 마십시오. 당신은 아마 그들을 잡지 않을 것입니다. –

+0

그게 나쁜가요? EasyHook은 2009 년부터 버려진 것 같지만, Detours 3는 올해 출시되었습니다. 그 하나 또는 이전 버전에 대한 나쁜 경험이 있었습니까? – cloudraven

답변

1

rand()과 친구들은 의사 난수 생성기이므로 실제로 제거하지 않아도됩니다. 동일한 시드의 경우 rand()에서 동일한 결과가 산출되므로 실제로 잡으려는 것은 time()에 대한 호출이며 RNG를 초기화하는 데 사용됩니다.

핵심적인 통찰력은 시스템 호출과 프로그램의 초기화되지 않은 메모리의 결과로 인해 단일 스레드 응용 프로그램의 큰 부분에 영향을 미치지 않는 스케줄링으로 인해 비 결정적 효과가 발생한다는 것입니다. 프로그램의 입력을 제어하기 위해 시스템 호출의 결과를 제어해야합니다. strace은 어떤 함수 호출을 재정의해야 하는지를 결정하기위한 매우 훌륭한 도구입니다. 초기화되지 않은 메모리가 사용되었는지 확인하려면 valgrind을 사용하십시오.

+0

고마워요, 그건 많은 의미가 있습니다. – cloudraven

관련 문제