https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121203

anlauf at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |anlauf at gcc dot gnu.org
           Keywords|                            |wrong-code
     Ever confirmed|0                           |1
   Last reconfirmed|                            |2025-07-21
             Status|UNCONFIRMED                 |NEW

--- Comment #1 from anlauf at gcc dot gnu.org ---
Confirmed.  All versions >= 7 generate wrong code and may crash with
double free or corruption.  Can be checked with -fsanitize=address etc.

Reduced testcase:

program p
  character(10), external :: f
  call eval(f,"abc")
  call eval(f,"abc")  ! double free or corruption
end
character(10) function f(arg)
  character(*) arg
  f=arg
end
subroutine eval(func,c_arg)
  character(*) c_arg
  character(*) func
  external func
! print *, len (c_arg)  ! Enable to see junk
  print *,func(c_arg)
end subroutine


The dump tree looks suspicious:

__attribute__((fn spec (". . w ")))
void eval (void (*<T693>) (character(kind=1)[1:_func] &, integer(kind=8)) func,
character(kind=1)[1:_c_arg] & restrict c_arg, integer(kind=8) _func,
integer(kind=8) _c_arg)

so we have 4 arguments (2 are character length), but the main translates as

  eval (f, &"abc"[1]{lb: 1 sz: 1}, 3);
  eval (f, &"abc"[1]{lb: 1 sz: 1}, 3);

thus I count 3 only.

Enabling the indicated statement shows random lengths.

Reply via email to