public inbox for fortran@gcc.gnu.org
 help / color / mirror / Atom feed
* Segfault when using defined assignment
@ 2023-03-08 18:19 Andrew Benson
  0 siblings, 0 replies; only message in thread
From: Andrew Benson @ 2023-03-08 18:19 UTC (permalink / raw)
  To: fortran

I opened a PR on bugzilla for the following:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109066

The following code (compiled using current trunk), when run, causes a 
segfault, and valgrind complains about an invalid read. The code appears 
correct to me, and runs correctly (no segfault, no warnings from valgrind) 
when compiled with ifort.

module Input_Parameters_Bug
  public
  
  type :: resourceManager
     integer   :: counter=0 ! Remove this to resolve segfault
   contains
     procedure :: resourceManagerAssign
     generic   :: assignment(=) => resourceManagerAssign
  end type resourceManager

  type hdf5Object
     private
     type   (resourceManager) :: objectManager
   contains
     procedure :: openGroup =>IO_HDF5_Open_Group
    ! procedure :: h5Assign  ! Add this defined assignment to avoid segfault.
    ! generic   :: assignment(=) => h5Assign
  end type hdf5Object

  interface hdf5Object
     module procedure hdf5Constructor
  end interface hdf5Object

  type :: inputParameters
     private
     type(hdf5Object), pointer :: outputParameters => null() ! Make this 
allocatable instead of pointer to resolve segfault
  end type inputParameters

  interface inputParameters
     module procedure inputParametersConstructorNode
  end interface inputParameters

contains

  subroutine resourceManagerAssign(to,from)
    implicit none
    class(resourceManager), intent(  out) :: to
    class(resourceManager), intent(in   ) :: from
    to%counter=from%counter+1
    write (0,*) "ASSIGN",to%counter    
    return
  end subroutine resourceManagerAssign

  function hdf5Constructor() result(self)
    implicit none
    type(hdf5Object) :: self
    return
  end function hdf5Constructor
  
  function IO_HDF5_Open_Group(inObject) result (self)
    implicit none
    type(hdf5Object) :: self
    class(hdf5Object), intent(in   ) :: inObject
    write (0,*) "OPEN"
    return
  end function IO_HDF5_Open_Group
  
  subroutine h5Assign(to,from)
    implicit none
    class(hdf5Object), intent(  out) :: to
    class(hdf5Object), intent(in   ) :: from
    write (0,*) "ASSIGN H5"
    to%objectManager=from%objectManager
    return
  end subroutine h5Assign

  function inputParametersConstructorNode(outputParametersGroup) result(self)
    implicit none
    type(inputParameters) :: self
    type(hdf5Object     ), intent(in   ) :: outputParametersGroup
    allocate(self%outputParameters)
    write (0,*) "START"
    self%outputParameters=outputParametersGroup%openGroup()
    write (0,*) "STOP"
    return
  end function inputParametersConstructorNode

end module Input_Parameters_Bug

program Test_Parameters_Bug
  use :: Input_Parameters_Bug
  implicit none
  type(hdf5Object)          :: outputFile
  type(inputParameters) :: testParameters
  outputFile=hdf5Object()
  write (0,*) "CALL"
  testParameters=inputParameters(outputFile)
end program Test_Parameters_Bug


$ gfortran bug.F90 -g
$ valgrind --track-origins=yes ./a.out 
==19625== Memcheck, a memory error detector
==19625== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==19625== Using Valgrind-3.17.0 and LibVEX; rerun with -h for copyright info
==19625== Command: ./a.out
==19625== 
 ASSIGN           1
 CALL
 START
 OPEN
==19625== Use of uninitialised value of size 8
==19625==    at 0x4012DF: 
__input_parameters_bug_MOD_inputparametersconstructornode (bug.F90:73)
==19625==    by 0x4017D4: MAIN__ (bug.F90:87)
==19625==    by 0x401812: main (bug.F90:81)
==19625==  Uninitialised value was created by a stack allocation
==19625==    at 0x401206: 
__input_parameters_bug_MOD_inputparametersconstructornode (bug.F90:67)
==19625== 

Program received signal SIGSEGV: Segmentation fault - invalid memory 
reference.

Backtrace for this error:
#0  0x4e161ef in ???
#1  0x4012df in __input_parameters_bug_MOD_inputparametersconstructornode
        at /data001/abenson/Galacticus/galacticus_gfortranFinalization/
bug.F90:73
#2  0x4017d4 in test_parameters_bug
        at /data001/abenson/Galacticus/galacticus_gfortranFinalization/
bug.F90:87
#3  0x401812 in main
        at /data001/abenson/Galacticus/galacticus_gfortranFinalization/
bug.F90:81
==19625== 
==19625== Process terminating with default action of signal 11 (SIGSEGV)
==19625==    at 0x4E1613E: raise (in /home/abenson/Galacticus/Tools/lib/
libc-2.12.1.so)
==19625==    by 0x4E161EF: ??? (in /home/abenson/Galacticus/Tools/lib/
libc-2.12.1.so)
==19625==    by 0x4012DE: 
__input_parameters_bug_MOD_inputparametersconstructornode (bug.F90:73)
==19625==    by 0x4017D4: MAIN__ (bug.F90:87)
==19625==    by 0x401812: main (bug.F90:81)
==19625== 
==19625== HEAP SUMMARY:
==19625==     in use at exit: 5,448 bytes in 18 blocks
==19625==   total heap usage: 22 allocs, 4 frees, 13,588 bytes allocated
==19625== 
==19625== LEAK SUMMARY:
==19625==    definitely lost: 0 bytes in 0 blocks
==19625==    indirectly lost: 0 bytes in 0 blocks
==19625==      possibly lost: 0 bytes in 0 blocks
==19625==    still reachable: 5,448 bytes in 18 blocks
==19625==         suppressed: 0 bytes in 0 blocks
==19625== Rerun with --leak-check=full to see details of leaked memory
==19625== 
==19625== For lists of detected and suppressed errors, rerun with: -s
==19625== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 4 from 4)
Segmentation fault

This segfault goes away if I:
1. Remove the "counter" variable from type "resourceManager"
2. Add a defined assignment for type "hdf5Object"
3. Change the "outputParameters" variable from a pointer to an allocatable.
-- 

* Andrew Benson: https://abensonca.github.io

* Galacticus: https://github.com/galacticusorg/galacticus




^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-03-08 18:19 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-08 18:19 Segfault when using defined assignment Andrew Benson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).