On Wed, Jun 25, 2025 at 07:47:55PM +0200, Alejandro Colomar wrote:
> Hi Eric,
> 
> On Wed, Jun 25, 2025 at 07:36:01PM +0200, Alejandro Colomar wrote:
> > On Wed, Jun 25, 2025 at 03:16:06PM +0200, Alejandro Colomar wrote:
> > > > >       @@ New footnote XXX
> > > > >       +XXX)
> > > > >       +While atypical,
> > > > >       +<b>realloc</b> may fail
> > > > >       +for a call that shrinks the block of memory.
> > > > 
> > > > Is it worth wording this as "may fail or return a different pointer
> > > > for a call that shrinks the block of memory"?
> > > 
> > > Yeah, we can add that.
> > 
> > I've changed my mind; the current wording of ISO C makes it that all
> > realloc(3) successful return values are new pointers, and it doesn't
> > seem to mention that the old pointer could be kept (I remember having
> > seen such text in older standards, I think; or maybe in POSIX), so let's
> > keep in that sense, and assume that realloc(3) always moves the memory,
> > even if sometimes it doesn't, as that is not observable by a conforming
> > program.
> 
> Oh, the text is still there; I didn't see it.  :)
> 
>       The realloc function returns a pointer to the new object
>       (which can have the same value as a pointer to the old object),
>       or a null pointer if the new object has not been allocated
> 
> I think I'll just remove that parenthetical, since it serves little
> purpose.

On the contrary, I think the parenthetical has a great purpose - it is
a hint to implementors that preserving the pointer values between the
old and new object is a desirable (but not mandatory) characteristic.
Deleting the parenthetical might cause people to misinterpret the
standard by mixing up "new object" with "new pointer", at which point
they might try to "fix" realloc(p,s) to never return p but always copy
data.  When doing valgrind or other similar malloc-checking analysis
of a program, I'd actually WANT that behavior for realloc, to make
sure my code is always safely dealing with any potential of a moved
pointer; but in the common case, I do NOT want the speed penalty of an
implementation that always has to copy memory rather than reusing
pointers just because the standard omitted the parenthetical hinting
that such behavior is permissible.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.
Virtualization:  qemu.org | libguestfs.org


Reply via email to