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.

Reply via email to