Hi Paul,

On Fri, Jun 20, 2025 at 08:50:07PM -0700, Paul Eggert wrote:
> On 2025-06-20 19:42, Alejandro Colomar wrote:
> 
> > > If ENOMEM is really needed, its presence should be justified in the
> > > proposal.
> > 
> > I wrote it, although maybe it would need to be clearer?
> 
> It would need reworking as it didn't feel like a justification to me.
> 
> 
> > Here's the part that justifies it:
> > 
> >     Here's the code that should be written for AIX or glibc:
> > 
> >             errno = 0;
> >             new = realloc(old, size);
> >             if (new == NULL) {
> >                     if (errno == ENOMEM)
> >                             free(old);
> >                     goto fail;
> >             }
> >             ...
> >             free(new);
> > 
> >     [...]
> > 
> >     If the realloc(3) specification was changed to require that
> >     realloc(p,0) returns non-null on success, and that realloc(p,0)
> >     only fails when out-of-memory, and to require that it sets
> >     errno to ENOMEM, then code written for AIX or glibc would
> >     continue working just fine, since the errno check would be
> >     redundant with the null check.  Simply, the conditional
> >     (errno == ENOMEM) would always be true when (new == NULL).
> > 
> > If that old code runs on a new system that doesn't set ENOMEM, it will
> > leak 'old'.  Admittedly, that code is currently only portable to POSIX
> > systems, which already require ENOMEM, and I don't expect POSIX would
> > lift that requirement (and would recommend not lifting it), so I expect
> > people won't run that code in arbitrary C2y platforms.
> 
> But this is exactly why the main proposal (i.e., null if-and-only-if
> failure) shouldn't require ENOMEM. The C standardizers have already thought
> through the ENOMEM issue and decided not to require ENOMEM. Whatever reasons
> they have, won't change because of the main proposal.
> 
> ENOMEM belongs to POSIX, and POSIX will retain ENOMEM regardless of whether
> C2y accepts the main proposal. We shouldn't try to link the two proposals
> together in the C standardization process, as that's more likely to gum up
> the works entirely.
> 
> 
> > I added the ENOMEM part because of the above, to make sure that the new
> > realloc(3) specification is fully backwards compatible to every existing
> > implementation, so that you can take your AIX or glibc or musl or
> > whatever code, and say "hey, I'll run this code on any C2y-conforming
> > platform; it should Just Work".
> 
> Those platforms are all POSIXish, and you'll be able to say "hey I'll run
> this code on any POSIX-202y system (which extends C2y) and it should Just
> Work". That's all anyone can reasonably expect. One can't reasonably expect
> to run a POSIXish program on any C2y system and let's not try to make that a
> goal.

Hmmmm, sounds reasonable.  I'll have both options available in the
proposal, and let the C Committee decide if they want to add ENOMEM,
without blocking the proposal by ENOMEM.


Have a lovely day!
Alex

-- 
<https://www.alejandro-colomar.es/>

Attachment: signature.asc
Description: PGP signature

Reply via email to