[PATCH, v2] PR libfortran/103634 - Runtime crash with PACK on zero-sized arrays
Harald Anlauf
anlauf@gmx.de
Mon Dec 13 20:27:17 GMT 2021
Works better with patch attached...
Am 13.12.21 um 21:25 schrieb Harald Anlauf via Gcc-patches:
> Hi Mikael,
>
> Am 09.12.21 um 21:37 schrieb Mikael Morin:
>> Hello,
>>
>> On 09/12/2021 21:05, Harald Anlauf via Fortran wrote:
>>> Dear all,
>>>
>>> I had thought that we had fixed this in the past (see PR31001),
>>> but it did fail for me with all gcc versions I have tried (7-12)
>>> for a slightly more elaborate case as in the old testcase.
>>>
>>> The loop in pack_internal did try to access the first element of
>>> the array argument to PACK even if one (or more) extents were zero.
>>> This is not good.
>>>
>>> Solution: check the extents and return early. (We already do a
>>> related check for the vector argument if present).
>>
>> If there is a vector argument, aren’t we supposed to copy it to the
>> result ?
>> There is something else to pay attention for, the early return should
>> come at least after the return array bounds have been set. In the
>> testcase an array with the correct bounds has been allocated beforehand
>> to hold the return value, but it’s not always the case.
>
> you are absolutely right, I had gotten that wrong.
>
>> For what it’s worth, the non-generic variant in pack.m4 (or in
>> pack_{i,f,c}{1,2,4,8,10,16}.c) has a zero extent check and it clears the
>> source ptr in that case, which makes it setup the return array and then
>> jump to the vector copy at the end of the function.
>>
>
> The code is so similar (for good reason) that it makes sense to keep
> it synchronous. I added code for 'zero_sized' array with the minor
> difference that I made it boolean instead of integer.
>
> I also extended the testcase so that it exercises PACK/pack_internal
> a little, for argument 'vector' present as well as not. (There are
> existing tests for intrinsic types, but not for the issue at hand).
>
> Regtested again, and checked the testcase (against other compilers
> and also with valgrind).
>
> OK now?
>
> Thanks,
> Harald
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Fortran-PACK-intrinsic-should-not-try-to-read-from-z.patch
Type: text/x-patch
Size: 4062 bytes
Desc: not available
URL: <https://gcc.gnu.org/pipermail/gcc-patches/attachments/20211213/340c2c1b/attachment-0001.bin>
More information about the Gcc-patches
mailing list