i use a compiler which really enforces the rule of comparing (or operating)
on two pointers pointing at the same object. The compiler is for a Unisys 1100
mainframe, which is a ones-complement, 36 bit, word addressable machine. This
thing is a walking validation test for well written C programs.

Its pointers are generally 2 words (8 9-bit bytes) long, except for pointer to
functions which are 8 words (64 9-bit bytes) long. Even with all of the
obvious adversities, it is not difficult to write C code. You have to watch
out for code which thinks that pointers can be put into ints (or longs) and
then back again, but other than that, things work.

You will also see problems like this, I suspect, on 8086 type segmented
architectures. Or so it would seem; I don't use such things.