Остановился бы D когда-либо, если бы имитирующий блок принятия решения о остановке H никогда не переставал бы его моделировать?
Остановился бы D когда-либо, если бы имитирующий блок принятия решения о остановке H никогда не переставал бы его моделировать?
#define u32 uint32_t
int D(u32 P)
{
if ( H(P, P) )
return 0;
return 1;
}
int main()
{
H((u32)D, (u32)D);
}
H симулирует частичную остановку на основе эмулятора x86. Его вход - это машинный адрес функции C, преобразованной в 32-битное целое число без знака. H имитирует свой первый параметр на входе своего второго параметра. В приведенном выше случае H имитирует D(D).
1 ответ
int Simulate(u32 P, u32 I)
{
((void(*)(u32))P)(I);
return 1;
}
Если H () никогда не прекращал моделировать D (), то можно видеть, что поведение остановки D () будет таким же, как если бы D () вызывал Simulate () вместо H (), поэтому D () никогда не завершится.