[Bug fortran/44912] [OOP] Segmentation fault on TBP

janus at gcc dot gnu dot org gcc-bugzilla@gcc.gnu.org
Thu Jul 29 19:36:00 GMT 2010



------- Comment #1 from janus at gcc dot gnu dot org  2010-07-29 19:36 -------
Here is a reduced/modified version of the code in comment #0, which also
exhibits a runtime segfault, although the code seems to be valid:


module polynomial
implicit none

private

type, public :: polynom
   complex, allocatable, dimension(:) :: a
   integer :: n
 contains
   procedure :: init_from_coeff
   procedure :: get_degree
   procedure :: add_poly
end type polynom

contains
  subroutine init_from_coeff(self, coeff)
    class(polynom), intent(inout) :: self
    complex, dimension(:), intent(in) :: coeff
    self%n = size(coeff) - 1
    allocate(self%a(self%n + 1))
    self%a = coeff
    print *,"ifc:",self%a
  end subroutine init_from_coeff

  function get_degree(self)   result(n)
    class(polynom), intent(in) :: self
    integer :: n
    print *,"gd"
    n = self%n
  end function get_degree

  subroutine add_poly(self)
    class(polynom), intent(in) :: self
    integer :: s
    print *,"ap"
    s = self%get_degree()         !!!! fails here
  end subroutine

end module polynomial

program test_poly
   use polynomial

   type(polynom) :: p1

   call p1%init_from_coeff([(1,0),(2,0),(3,0)])
   call p1%add_poly()

end program test_poly


After being compiled with gfortran r162688 on x86_64-unknown-linux-gnu, it
prints the following output:

 ifc: (  1.0000000    ,  0.0000000    ) (  2.0000000    ,  0.0000000    ) ( 
3.0000000    ,  0.0000000    )
 ap
Segmentation fault


Valgrind says:

==25251== Invalid read of size 8
==25251==    at 0x400A02: __polynomial_MOD_init_from_coeff (c0.f90:42)
==25251==    by 0x400950: __polynomial_MOD_add_poly (c0.f90:36)
==25251==    by 0x400DCF: MAIN__ (c0.f90:47)
==25251==    by 0x400E30: main (c0.f90:42)
==25251==  Address 0x1c is not stack'd, malloc'd or (recently) free'd
==25251== 
==25251== 
==25251== Process terminating with default action of signal 11 (SIGSEGV)
==25251==  Access not within mapped region at address 0x1C
==25251==    at 0x400A02: __polynomial_MOD_init_from_coeff (c0.f90:42)
==25251==    by 0x400950: __polynomial_MOD_add_poly (c0.f90:36)
==25251==    by 0x400DCF: MAIN__ (c0.f90:47)
==25251==    by 0x400E30: main (c0.f90:42)


This is a very strange error. It seems "init_from_coeff" is called from
"add_poly", although this is definitely not the case in the Fortran code. Maybe
something goes wrong in the vtab, like PPCs having wrong addresses, etc.


-- 

janus at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
     Ever Confirmed|0                           |1
   Last reconfirmed|0000-00-00 00:00:00         |2010-07-29 19:36:06
               date|                            |


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44912



More information about the Gcc-bugs mailing list