- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I've had some issues trying to make some Fortran tests work (they use pFUnit, which requires most of Fortran 2003 to be implemented). It's rather difficult to reduce the test cases, partly because I get a lot of different symptoms (e.g. segfaults, hanging), and partly because there is generated code in the unit test framework, which is hard to modify by hand without causing problems.
Anyway, I've been trying to figure out whether there are bugs in ifort 14.0 that are contributing to this. I mocked up a case that has some similarities to the code I'm trying to debug, and managed to find an error in the handling of an allocatable.
module foo_bar_types
implicit none
type :: array_type
integer, allocatable :: array(:)
end type array_type
abstract interface
type(array_type) function get_array_wrapper()
import :: array_type
end function get_array_wrapper
end interface
type :: foo
procedure(get_array_wrapper), pointer, nopass :: getter => null()
end type foo
end module foo_bar_types
program test_polymorphic_allocation
use foo_bar_types
implicit none
type(foo) :: bar_source
class(foo), allocatable :: bar_poly
integer :: i
allocate(bar_poly, source=bar_source)
deallocate(bar_poly)
end program test_polymorphic_allocation
I guess the first question that comes to mind is, have I done something wrong, or does this look like a potential bug in ifort? This test case is maximally reduced and bizarrely specific. The error goes away if:
- foo is defined in the program instead of a separate module.
- bar_poly is changed to not be polymorphic.
- foo does not contain the specific component it does, namely:
- A pointer to a procedure,
- that returns a derived type,
- with an allocatable, array component.
If you remove the "deallocate" statement from the test case, then the error goes away, but valgrind still finds an issue with the allocate statement.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
After looking at this a bit longer, I'm fairly confident that this is a bug in ifort...
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I see nothing wrong with your code and would be inclined to agree that this is a defect in the compiler. Oddly, on OS X (mavericks) and ifort 13.0.2 20130314 I get no compile time or run time errors if I compile your code without any flags to ifort, nor does instruments leak check find any leaks. (Memcheck is still very experimental on OS X AFAICT)
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I think the compiler is mishandling the allocate with source=. I think this is an issue we're already working but I will check.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
FWIW, the code snippet in the original post compiles and executes without any issues using gfortran 4.9.
Don't know if this is of any help: on the Windows platform with the "Release" configuration (i.e., optimizations turned on) the code compiles and executes fine using Intel Fortran XE 2013, Update 1; it is only the "Debug" configuration that raises a run-time error from the Microsoft C run-time library with heap corruption. On Linux, the behavior may be different. But I hope the eventual fix in Intel Fortran will resolve the run-time issue on Windows as well.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
While the program may execute without errors, that doesn't mean it is doing it correctly. The type of error is one the program may or may not have an issue with.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Steve Lionel (Intel) wrote:
While the program may execute without errors, that doesn't mean it is doing it correctly. The type of error is one the program may or may not have an issue with.
Steve,
Thanks, appreciate your comments. Note my interest is in sourced allocation (and also, "molded" allocation) involving polymorphic types using Intel Fortran, albeit on the Windows platform. That's something I've been using extensively in my code. Since the OP was mainly raising the issue about run-time error during sourced allocation, I was just curious how my Windows version of the compiler would respond to the same code. When it failed with a C run-time library exception in Debug configuration, it seemed like something that might be worth looking into for the benefit of Windows users of Intel Fortran, regardless of the Release configuration result. By the way, on the Release version runs (tried 3 different settings: /O1, O2, and /O3), I did keep an eye on the SysInternals Process Explorer utility before, during, and after execution for memory leaks, etc. but didn't notice anything amiss.
That reminds me: would Intel Inspector (or is it VTune Analyzer) correctly inform the user of any memory issues with Fortran 2003 and 2008 features such as sourced (and MOLD=) allocation?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Inspector XE does complain about this program.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Escalated as issue DPD200256204. The error also goes away if one uses MOLD= instead of SOURCE= for the allocate.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
This has been fixed for the 15.0 release later this year.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page