[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