- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Dear all,
in some cases I pass slices of allocated arrays to functions (in modules -> explicit interface) - who does not ;-).
I have encountered a nasty bug in my code, where - although array bound checking is activated - no exception is thrown by the compiler in runtime (16.0.3, 17.0, x64). I can reproduce this in the following example:
module mod_foo
use ISO_FORTRAN_ENV, only : rk => real64
implicit none
private
public :: rk
public :: sub_foo
contains
subroutine sub_foo(bar_1, bar_2, bar_3)
implicit none
real(rk), dimension(:), intent(in ) :: bar_1
real(rk), dimension(:), intent(in ) :: bar_2
real(rk), dimension(:), intent( out) :: bar_3
bar_3(1:10) = bar_1 + bar_2
return
end subroutine sub_foo
end module mod_foo
program array_bounds
use mod_foo
implicit none
! Variables
real(rk), dimension(:), allocatable :: bar_1
real(rk), dimension(:), allocatable :: bar_2
real(rk), dimension(:), allocatable :: bar_3
! Body of array_bounds_or_shape
print *, 'Hello World'
allocate(bar_1(10))
allocate(bar_2(10))
allocate(bar_3(20))
bar_1 = 1.0_rk
bar_2 = 2.0_rk
call sub_foo(bar_1(1:10),bar_2(1:20),bar_3(1:20)) ! this line contains the error: bar_2 has a upper bound of 10!! not captured, why
write(*,'(*(ES12.4))') bar_3
bar_2(20) = 0.0_rk ! this is captured
continue
end program array_bounds
Compiler settings: /nologo /debug:full /Od /warn:interfaces /Qinit:snan /Qinit:arrays /fp:source /module:"x64\Debug\\" /object:"x64\Debug\\" /Fd"x64\Debug\vc140.pdb" /traceback /check:pointer /check:bounds /check:uninit /check:stack /libs:static /threads /dbglibs /c
As commented the call to the function with the obviously wrong bound of bar_2 is not captured, while the bound check two lines below works.
I run the same code under Linux with PSXE 16.0 and GFortran 4.8.3. The Intel version does not throw an exception in the function call line, while GFortran does for the same line:
Fortran runtime error: Index '20' of dimension 1 of array 'bar_2' outside of expected range
It would be nice, if the Intel compilers will catch errors like this. Or is this non-standard Fortran?
Best regards, Johannes
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
What happens when you change sub_foo, bar_2 to have intent(inout), then add at line 18, bar_2(15) = 1.0?
IOW actually use a location that is out of bounds.
Jim Dempsey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The compiler is simply not doing bounds checking for array slices as actual arguments. I have submitted a request that it do so - DPD200415122.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page