On Sat, Nov 12, 2022 at 11:42:09AM +0100, René Scharfe wrote: > > E.g. we have plenty of code that assumes ASCII, instead of catering to > > EBCDIC, and assuming NULL is (void *)0, not (void *)123456 or whatever. > > NULL is defined as "0" or "(void *)0" by C99 6.3.2.3 Pointers paragraph > 3 and 7.17 Common definitions <stddef.h> paragraph 3. I think he is alluding to the fact that while the standard requires that a "0" constant refers to a NULL pointer, the representation does not have to be all-bits-zero. So: char *foo = 0; is fine, but: char *foo; memset(foo, 0, sizeof(&foo)); is not. And we absolutely do the latter in our code base anyway, because it's convenient and unlikely to be a problem on practical platforms. And I think it has always been our attitude in this community to let engineering practicality trump strict adherence to the standard. But "practicality" there should be measuring the tradeoff of how useful something is versus how likely it is to bite us. In the case under discussion, my gut feeling agrees with you, though. I'm skeptical that equivalence of object and function pointers is all that useful in practice. And your mention of CHERI seems like a plausible way it could bite us. -Peff