On Wed, 5 Mar 2025 17:30:28 +0300 Dan Carpenter <dan.carpenter@xxxxxxxxxx> wrote: > On Wed, Mar 05, 2025 at 02:17:32PM +0000, David Laight wrote: ... > > And the 'fun' starts because NULL isn't required to use the all-zero > > bit pattern. > > Regardless of the bit-pattern, things like (void *)(1 - 1) are valid > > NULL pointers. > > > > Of course, while C allows this, I doubt NULL has ever been other than 0. > > (It was 0 on a system I used many years ago where the O/S invalid pointer > > was ~0.) > > Kernel style guidelines don't even allow if (p == NULL) so we would be > screwed. :P Doesn't matter: if (!p) ... if (p == 0) ... if (p == (void *)0) ... if (p == NULL) ... if (p == (void *)(constant integer expression with value 0)) ... and the equivalent assignments all behave the same regardless of the bit-pattern use for NULL. So: union { long l; void *p; } lpu; lpu.p = 0; return lpu.l; Returns ABI (implementation) defined constant value. I think the only requirement is that it can never be the address of a valid variable. David