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