[Patch, Fortran] PR53521 - Fix size == 0 handling with reallocate
Jakub Jelinek
jakub@redhat.com
Thu May 31 09:45:00 GMT 2012
On Thu, May 31, 2012 at 11:28:20AM +0200, Tobias Burnus wrote:
> I see two possibilities:
>
>
> 1) FIRST approach: manual freeing/NULL setting; that's the closed
> what is currently done. (Note: It calls free unconditionally;
> "free(0)" is optimized away by the middle end.
> (Note: That requires an update of the "free" count in
> gfortran.dg/allocatable_function_4.f90)
> --------------------------------------------------------------------
> if (D.1887 == 0)
> {
> __builtin_free ((void *) atmp.0.data);
> D.1888 = 0B;
> }
> else
> {
> D.1888 = (integer(kind=4)[0] * restrict) __builtin_realloc
> ((void *) atmp.0.data, D.1887);
> if (D.1888 == 0B && D.1887 != 0)
You wouldn't need to check D.1887 != 0 here, that check has been performed
earlier.
> 2) SECOND approach: Simply removing the NULL setting and just using
> the result which realloc returns; if not NULL, the free() will
> properly handle it.
> --------------------------------------------------------------------
> D.1888 = (integer(kind=4)[0] * restrict) __builtin_realloc
> ((void *) atmp.0.data, D.1887);
> if (D.1888 == 0B && D.1887 != 0)
> {
> _gfortran_os_error (&"Allocation would exceed memory
> limit"[1]{lb: 1 sz: 1});
> }
> atmp.0.data = (void * restrict) D.1888;
> --------------------------------------------------------------------
Yeah, POSIX says on realloc return value:
If size was equal to 0, either NULL or a pointer suitable to be passed to
free() is returned. So, for POSIX compatible realloc implementation the
second approach should be fine.
> I like the second version more. (And I would even consider to get
> rid of the os_error.)
Without the os_error, you'd just crash silently on allocation failures?
Jakub
More information about the Gcc-patches
mailing list