[Bug fortran/26801] -fbounds-check generates segfault
fxcoudert at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Sun May 28 13:23:00 GMT 2006
------- Comment #3 from fxcoudert at gcc dot gnu dot org 2006-05-28 13:23 -------
I tried with the following reduced testcase:
implicit none
integer :: i
logical :: l
type dt
integer, pointer :: a => null()
end type dt
type(dt), pointer :: obj(:) => null()
allocate(obj(2))
i = 1
l = associated(obj(i)%a)
print *, l
end
The code generated for the ASSOCIATED statement is the following when
bounds-checking is disabled:
i = 1;
l = (*(struct dt[0:] *) obj.data)[obj.dim[0].stride * i + obj.offset].a !=
0B;
When bounds-checking is enabled, it is changed into:
i = 1;
{
int4 D.924;
l = (*(struct dt[0:] *) obj.data)[obj.dim[0].stride * D.924 + obj.offset].a
!= 0B;
}
Notice that D.924 is used uninitialized. The -fbounds-check options gives a
special codepath in three occasions:
0x080ad083 in gfc_conv_ss_startstride (loop=0xbfa1813c)
at ../../../trunk/gcc/fortran/trans-array.c:2456
2456 if (flag_bounds_check)
(gdb) c
Continuing.
Hardware read watchpoint 1: flag_bounds_check
Value = 1
0x080acc2c in gfc_conv_array_ref (se=0xbfa17ab4, ar=0x87222bc)
at ../../../trunk/gcc/fortran/trans-array.c:1951
1951 if (flag_bounds_check && ar->as->type != AS_ASSUMED_SIZE)
(gdb)
Continuing.
Hardware read watchpoint 1: flag_bounds_check
Value = 1
0x080acd5c in gfc_conv_array_ref (se=0xbfa17ab4, ar=0x87222bc)
at ../../../trunk/gcc/fortran/trans-array.c:1980
1980 if (flag_bounds_check)
I don't understand where this D.924 variable is generated.
--
fxcoudert at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |fxcoudert at gcc dot gnu dot
| |org
Last reconfirmed|2006-03-22 21:22:10 |2006-05-28 13:23:39
date| |
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26801
More information about the Gcc-bugs
mailing list