[Bug fortran/55341] address-sanitizer and Fortran

Joost.VandeVondele at mat dot ethz.ch gcc-bugzilla@gcc.gnu.org
Fri Dec 21 08:19:00 GMT 2012


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55341

--- Comment #42 from Joost VandeVondele <Joost.VandeVondele at mat dot ethz.ch> 2012-12-21 08:18:39 UTC ---
(In reply to comment #41)
> Wild guess: does Fortran have any custom unwinding mechanism (like exceptions
> in C++ or longjmp in C)?
> For C/C++ we've spent quite some time to get rid of false stack-buffer-overflow
> reports caused by exceptions and longjmp.

Fortran doesn't have those naturally, but I don't know if they are generated
somehow by the FE. The -fdump-tree-original of the offending routine looks very
innocent C-like:

cp_int_to_string (character(kind=1)[1:6] & __result, integer(kind=4) .__result,
integer(kind=4) & restrict i)
{
  integer(kind=4) iostat;
  real(kind=8) tmp_r;

  if ((unsigned int) *i + 99999 > 1099998)
    {
      tmp_r = (real(kind=8)) *i;
      {
        struct __st_parameter_dt dt_parm.1;

        dt_parm.1.common.filename =
&"/data/vjoost/gnu/cp2k/cp2k/src/../src/cp_log_handling.F"[1]{lb: 1 sz: 1};
        dt_parm.1.common.line = 880;
        dt_parm.1.internal_unit = (character(kind=1) *) __result;
        dt_parm.1.internal_unit_len = 6;
        dt_parm.1.internal_unit_desc = 0B;
        dt_parm.1.common.unit = 0;
        iostat = 0;
        dt_parm.1.common.iostat = &iostat;
        dt_parm.1.format = &"(es6.1)"[1]{lb: 1 sz: 1};
        dt_parm.1.format_len = 7;
        dt_parm.1.common.flags = 20512;
        _gfortran_st_write (&dt_parm.1);
        _gfortran_transfer_real_write (&dt_parm.1, &tmp_r, 8);
        _gfortran_st_write_done (&dt_parm.1);
      }
    }
  else
    {
      {
        struct __st_parameter_dt dt_parm.2;

        dt_parm.2.common.filename =
&"/data/vjoost/gnu/cp2k/cp2k/src/../src/cp_log_handling.F"[1]{lb: 1 sz: 1};
        dt_parm.2.common.line = 882;
        dt_parm.2.internal_unit = (character(kind=1) *) __result;
        dt_parm.2.internal_unit_len = 6;
        dt_parm.2.internal_unit_desc = 0B;
        dt_parm.2.common.unit = 0;
        iostat = 0;
        dt_parm.2.common.iostat = &iostat;
        dt_parm.2.format = &"(i6)"[1]{lb: 1 sz: 1};
        dt_parm.2.format_len = 4;
        dt_parm.2.common.flags = 20512;
        _gfortran_st_write (&dt_parm.2);
        _gfortran_transfer_integer_write (&dt_parm.2, (integer(kind=4) *) i,
4);
        _gfortran_st_write_done (&dt_parm.2);
      }
    }
  L.2:;
  if (iostat != 0)
    {
      {
        struct __st_parameter_dt dt_parm.3;

        dt_parm.3.common.filename =
&"/data/vjoost/gnu/cp2k/cp2k/src/../src/cp_log_handling.F"[1]{lb: 1 sz: 1};
        dt_parm.3.common.line = 885;
        dt_parm.3.common.flags = 128;
        dt_parm.3.common.unit = 6;
        _gfortran_st_write (&dt_parm.3);
        _gfortran_transfer_character_write (&dt_parm.3, &"cp_int_to_string
ioerror"[1]{lb: 1 sz: 1}, 24);
        _gfortran_transfer_integer_write (&dt_parm.3, &iostat, 4);
        _gfortran_st_write_done (&dt_parm.3);
      }
      {
        integer(kind=4) D.2050;

        D.2050 = cp_logger_get_default_unit_nr (0B, 0B, 0B);
        print_stack (&D.2050);
      }
    }
  L.3:;
}



More information about the Gcc-bugs mailing list