http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49479

--- Comment #4 from Tobias Burnus <burnus at gcc dot gnu.org> 2011-06-21 
08:58:31 UTC ---
(In reply to comment #3)
> I think gfortran's convention is - and also TR 29113 requires - that the
> addr_expr is not NULL if the variable is allocated - even if it is zero sized.

The TR 29113 draft (Interop ML version) has (5.2.3 CFI_cdesc_t)
ftp://ftp.nag.co.uk/sc22wg5/N1851-N1900/N1854.pdf

"void * base addr; If the object is an unallocated allocatable or a pointer
that is disassociated, the value is NULL. If the object has zero size, the
value is not NULL but is otherwise processor-dependent. Otherwise [...]"


And trans.c has for gfc_call_malloc:
/* Call malloc to allocate size bytes of memory, with special conditions:
      + if size == 0, return a malloced area of size 1,


If one looks at RESHAPE in the library:
 
http://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libgfortran/intrinsics/reshape_generic.c;hb=HEAD
one sees:

  86   if (ret->data == NULL)
  87     {
  88       rs = 1;
  89       for (n = 0; n < rdim; n++)
  90         {
  91           rex = shape_data[n];
  93           GFC_DIMENSION_SET(ret->dim[n],0,rex - 1,rs);
  95           rs *= rex;
  96         }
  98       ret->data = internal_malloc_size ( rs * size );

Thus, if shape_data[n] == 0 -- which is here the case --, "rs" == 0 and thus
one calls malloc with zero size. POSIX states:
"If size is 0, either a null pointer or a unique pointer that can be
successfully passed to free() shall be returned."

Hence, the "rs*size" should be replaced by "MAX(1, rs*size)".

I think other intrinsics will have the same problem.

Reply via email to