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:;

}

Reply via email to