In the example given here, you could get away with it since control flow doesn't depend on the value of id(object()). But for example, if you had:
if (id(object()) >> 12) & 1:
print "foo"
else:
print "bar"
You would need to guarantee that id(object()) always returned the same value so that the execution follows the same path.What I should have said is that the address space layout is a source of non-determinism that would otherwise need to be accounted for in the recording of a program.
Further, I hold to the view that given a program, knowledge of the thread execution schedule/scheduler and the results of external calls, a program's execution should be deterministic.
Thinking about this now, I realize disabling ASLR shouldn't be enough to fix this problem since recording and replaying are sufficiently different.
Ah yes, it needs to be deterministic in the context of a time-traveling debugger, I was thinking about the general case, sorry.
> Further, I hold to the view that given a program, knowledge of the thread execution schedule/scheduler and the results of external calls, a program's execution should be deterministic.
Surely it is, if you precisely know all timings and IO and can replay them there's nowhere for non-determinism to creep in.
That's not really an acceptable scale of required knowledge for a time-traveling debugger though.
This was my original point, the address space layout information leaks into python land via things like id.
> That's not really an acceptable scale of required knowledge for a time-traveling debugger though.
That's what recording captures (though, you don't need to know the times at which things happened).