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

Reply via email to