[libgfortran,patch] Zero-length strings messed up in library (PR33079)
Tobias Schlüter
Tobias.Schlueter@physik.uni-muenchen.de
Thu Aug 16 16:48:00 GMT 2007
FX Coudert wrote:
>>> - if (*len > 0)
>>> + if (*len == 0)
>>> + {
>>> + /* A zero-length Fortran string is "". */
>>> + char * tmp = internal_malloc_size (1);
>>> + tmp[0] = '\0';
>>> + *dest = tmp;
>>> + }
>>> + else
>>
>> Do you zero-terminate the string because you don't want to allocate
>> zero memory? I don't know if allocating a pointer to zero memory
>> would work, though.
>
> I don't think you can portably call malloc(0) and expect a non-NULL
> pointer out of it. From
> http://www.opengroup.org/onlinepubs/009695399/functions/malloc.html :
>> If the size of the space requested is 0, the behavior is
>> implementation-defined: the value returned shall be either a null
>> pointer or a unique pointer.
> Also, internal_malloc_size catches this case and returns NULL, so I
> think it's more reasonable to special-case zero right there. (And I do
> set the allocated memory to zero just to make sure we don't end up with
> unassigned memory.)
An alternative would be to have a
static char zero_length_string[0]; // Maybe [1]
at file scope and then do
*dest = zero_length_string;
This would evade the unnecessary allocations.
Your patch is ok, if you don't like my suggestion better.
- Tobi
More information about the Fortran
mailing list