Hi David, On Wed, Jan 07, 2026 at 12:47:18AM +0000, David Svoboda wrote: [...] > I could argue that this UB is really redundant, as it is a variant of > the UB you get from reading past the end of an array. > (notwithstanding that the array has zero length). Clearly not. First of all, requesting an array of zero elements is not accessing the array, so you can't put both UB in the same category. Second, NULL is not an array of zero elements. NULL is an invalid pointer. You can't do anything with NULL (or you couldn't until it was changed recently). With an array of zero elements, you can do pointer arithmetic and hold the pointer just fine, as long as you don't read past the end: int a[0]; int *p, *end; p = a; end = a + _Countof(a); while (p < end) do_stuff(p); The above is valid in compilers that support arrays of zero elements, but is (was) not valid with NULL. And third, a pointer to the first element of an array of zero elements is *not* past the end; it is the same as a pointer one after the last element, and thus it's perfectly valid to hold it. > We could also argue that this should be implementation-defined > behavior, or even unspecified behavior. No, this is what we had in C17, and UB is much better than that. C17 destroyed the standard definition of realloc(p,0), even though it was supposed to be a no-op change. To some degree, I'm happy that that changed, as that brought us to now, where it is obvious that the only way forward is to go back to the traditional BSD specification. > However, the UBSG's current > arsenal for slaying earthly demons has traditionally not extended to > changing what platforms do, as n3752 does. So IMO the UBSG should > stand back and wait for n3752 to be resolved. Have a lovely day! Alex --