https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116254
Richard Sandiford <rsandifo at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Ever confirmed|0 |1
Last reconfirmed| |2024-08-21
--- Comment #10 from Richard Sandiford <rsandifo at gcc dot gnu.org> ---
A bit more info: valgrind succeeds for -O0. But with optimisation enabled (-O
is enough), it flags:
==12989== Conditional jump or move depends on uninitialised value(s)
==12989== at 0x49B47A0: _gfortran_spread (spread_generic.c:278)
==12989== by 0x401227: check_spread (class_transformational_2.f90:56)
==12989== by 0x401227: MAIN__ (class_transformational_2.f90:20)
==12989== by 0x4035C3: main (class_transformational_2.f90:24)
It seems that the _data._desc field of the spread results are being copied from
uninitialised memory. .gimple has:
__attribute__((fn spec (". ")))
void check_spread ()
{
…
{
…
struct array02_character(kind=1) atmp.98;
struct __class_MAIN___T_2_0a ctmp.99;
…
try
{
…
ctmp.99 = b;
ctmp.99._data = atmp.98;
ctmp.99._data.span = D.3687;
ctmp.99._data.data = 0B;
ctmp.99._data.offset = 0;
_gfortran_spread (&ctmp.99._data, D.3682, D.3684, D.3686);
where nothing has initialised atmp.98 before the copy.