Many processors have undefined behavior. The x86 manuals, for instance, specify (or rather, explicitly decline to specify) lots of it:
- Values of certain flags after certain instructions
- The result of bsf or bsr on 0.
- I think there are some floating point operations that can be undefined when the results fall off the edge of representability, but I don't remember off the top of my head.
These have behavior that differs from processor to processor.
This isn't to mention the various kinds of processor errata that pop up: loads being reordered with LOCK'd x86 instructions, or ARM memory reads that go backwards in time, both of which happen in real processors despite being architecturally forbidden.