Why does segmentation fault arise in fortran under calling subroutine nested gradually in two functions with double precision?Calling a subroutine in Fortran (Segmentation fault)Fortran: Calling a Subroutine in a FunctionSegmentation fault occurs at top of subroutine when C code calls Fortran subroutineSegmentation fault when passing a function as argument in a subroutineSegmentation fault, when passing functions with array arguments to subroutine in FortranSegmentation fault when calling C from FortranUsing CMPLX function for double or quad precision in FortranJulia calling Fortran. signal (11): Segmentation fault errorAre the specific double precision functions in Fortran useful?How to pass the kind for real precision to functions and subroutines in Fortran?

Does this Foo machine halt?

Team goes to lunch frequently, I do intermittent fasting but still want to socialize

Converting Piecewise function to C code

How can a surrogate pass on genes to a fertilized embryo?

How can I iterate this process?

Improving software when the author can see no need for improvement

Why does Intel's Haswell chip allow FP multiplication to be twice as fast as addition?

Shabbat clothing on shabbat chazon

How can I tell if a flight itinerary is fake?

Plausibility of Ice Eaters in the Arctic

What does Apple mean by "This may decrease battery life"?

Non-OR journals which regularly publish OR research

Max Order of an Isogeny Class of Rational Elliptic Curves is 8?

Why aren’t emergency services using callsigns?

Does a code snippet compile? Or does it get compiled?

Ordering a word list

Senior dev discreetly remoting in to computer and watching a coworker

Look mom! I made my own (Base 10) numeral system!

In reversi, can you overwrite two chips in one move?

Best gun to modify into a monsterhunter weapon?

Ex-contractor published company source code and secrets online

How do I explain to a team that the project they will work on for six months will certainly be cancelled?

During the Space Shuttle Columbia Disaster of 2003, Why Did The Flight Director Say, "Lock the doors."?

Author changing name



Why does segmentation fault arise in fortran under calling subroutine nested gradually in two functions with double precision?


Calling a subroutine in Fortran (Segmentation fault)Fortran: Calling a Subroutine in a FunctionSegmentation fault occurs at top of subroutine when C code calls Fortran subroutineSegmentation fault when passing a function as argument in a subroutineSegmentation fault, when passing functions with array arguments to subroutine in FortranSegmentation fault when calling C from FortranUsing CMPLX function for double or quad precision in FortranJulia calling Fortran. signal (11): Segmentation fault errorAre the specific double precision functions in Fortran useful?How to pass the kind for real precision to functions and subroutines in Fortran?






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








0















I try to call subroutine SPLEV of FITPACK library through two functions ('wer' and 'qwe') nested one into another (the code is below).



The following message appears under execution of compiled program:




QWE



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



Backtrace for this error:



0 0x7F3EE4BF3E08



1 0x7F3EE4BF2F90



2 0x7F3EE453A4AF



3 0x4041B6 in splev_



4 0x400BD0 in value.3386 at pr.f90:?



5 0x400A6B in MAIN__ at pr.f90:?



Ошибка сегментирования (сделан дамп памяти)




If I compile my program with flags -g -fbacktrace -fsanitize=address,zero,undefined the follow output message appears:




QWE



0.37051690837706980



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



Backtrace for this error:



0 0x7FAB5F45CE08



1 0x7FAB5F45BF90



2 0x7FAB5EDA34AF



3 0x4075F0 in splev_ at splev.f:73 (discriminator 2)



4 0x400DDE in value.3386 at pr.f90:87



5 0x400FFA in qwe.3406 at pr.f90:43



6 0x400F88 in wer.3403 at pr.f90:48



7 0x400D08 in MAIN__ at pr.f90:38



Ошибка сегментирования (сделан дамп памяти)




If I compile my program with flags -g -fbacktrace -Wall -fcheck=all the follow output message appears:




QWE



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



Backtrace for this error:



0 0x7F2BE6F0FE08



1 0x7F2BE6F0EF90



2 0x7F2BE68564AF



3 0x4075F0 in splev_ at splev.f:73 (discriminator 2)



4 0x400DDE in value.3386 at pr.f90:87



5 0x400C46 in MAIN__ at pr.f90:35



Ошибка сегментирования (сделан дамп памяти)




If I compile my program with flags -g -fbacktrace -fsanitize=address the follow output message appears:




QWE



ASAN:SIGSEGV



=================================================================



==4796==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000 (pc 0x000000408f67 bp 0x7ffe7a134440 sp 0x7ffe7a1341e0 T0)



0 0x408f66 in splev_ /home/yurchvlad/Science/Coll_Int/F90/f90DP/1/splev.f:73



1 0x40145d in value.3386 (/home/yurchvlad/Science/Coll_Int/F90/f90DP/1/curfit+0x40145d)



2 0x4011a3 in intcoll /home/yurchvlad/Science/Coll_Int/F90/f90DP/1/pr.f90:35



3 0x401849 in main /home/yurchvlad/Science/Coll_Int/F90/f90DP/1/pr.f90:2



4 0x7fcad9b3282f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)



5 0x400d38 in _start (/home/yurchvlad/Science/Coll_Int/F90/f90DP/1/curfit+0x400d38)



AddressSanitizer can not provide additional info.



SUMMARY: AddressSanitizer: SEGV /home/yurchvlad/Science/Coll_Int/F90/f90DP/1/splev.f:73 splev_



==4796==ABORTING




Firstly I will show the code and then I will give some information about subroutines CURFIT and SPLEV of library FITPACK which are playing there a principal role.



Here is my code. This is just a test program, i.e. it is not confusion, that I interpolate there array of values of analytical function.



PROGRAM IntColl
USE Constants
IMPLICIT NONE

INTEGER :: i, nen ! i = counter
! nen, nmn, ne is sirvice variables, which
! appear on exit of CURFIT and needed on entry
! of SPLEV and SPLINT

REAL(DP) :: foo
REAL(DP) :: MOM1 ! dimensionless neutrino momentum

REAL(DP) :: dmg ( 1 : 2 * NG) ! dimensionless momentum grid
REAL(DP) :: endf( 1 : 2 * NG) ! electron neutrino distribution function
! muon neutrino distribution function
! electron and positron distribution function

REAL(DP) :: ten ( 1 : 2 * NG + k + 1) ! service arrays:
! ten is array arising on exit of working of CURFIT
! and contain knots of the spline (for endf, mndf and edf correspondingly).
REAL(DP) :: cen ( 1 : 2 * NG + k + 1) ! needed on entry of SPLEV and SPLINT
! cen appear on exit of CURFIT, contain coefficients of spline
! (for endf, mndf and edf correspondingly) and needed on entry of SPLEV and SPLINT.
REAL(DP) :: w ( 1 : 2 * NG + k + 1) ! w is array of weights for points on entry of CURFIT.

DO i = 1, 2 * NG
dmg(i) = i / 10.D+00 ! filling arrays to give their
endf(i) = eq_nu_di_fu(dmg(i)) ! on entry into subroutine
w(i) = 1.d+00 ! CURFIT
END DO

MOM1 = .53D+00
PRINT *, 'QWE'
CALL spline(dmg, endf, nen, ten, cen)
foo = value(MOM1, ten, nen, cen)
PRINT *, foo

PRINT *, wer(MOM1)
CONTAINS

REAL(DP) FUNCTION qwe(q) ! qwe and wer is "wrappers" for using
REAL(DP) :: q ! of subroutines spline > curfit
qwe = value(q, ten, nen, cen) ! in main program
END FUNCTION qwe

REAL(DP) FUNCTION wer(q)
REAL(DP) :: q
wer = qwe(q)
END FUNCTION wer

SUBROUTINE spline(x, y, n, t, c) ! spline is "hand-made wrapper" for
IMPLICIT NONE ! more convenient using of subroutine
! CURFIT in main program
INTEGER :: m, nest, n, lwrk, ier
INTEGER, PARAMETER :: iopt = 0
INTEGER :: iwrk( 1 : 10 * NG )

REAL(DP) :: xb, xe, fp
REAL(DP) :: wrk( 1 : 2 * NG * (k + 1) + (2 * NG + k + 1) * (7 + 3 * k) )
REAL(DP) :: x( 1 : 2 * NG), y(1: 2 * NG )
REAL(DP) :: t( 1 : 2 * NG + k + 1 )
REAL(DP) :: c( 1 : 2 * NG + k + 1 )

xb = 0.d+00
xe = x(2 * NG)
m = 2 * NG
nest = m + k + 1
lwrk = 2 * NG * (k + 1) + nest * (7 + 3 * k)

CALL curfit(iopt, m, x, y, w, xb, xe, k, s, nest, n, t, c, fp, wrk, lwrk, iwrk, ier)

END SUBROUTINE spline

REAL(DP) FUNCTION value(q, t, n, c) ! value is "hand-made wrapper" for
IMPLICIT NONE ! more convenient using of subroutine
! SPLEV in main program
INTEGER :: n, ier ! SPLEV should work only after
INTEGER, PARAMETER :: m = 1 ! CURFIT edned its working

REAL(DP) :: q
REAL(DP) :: t( 1 : 2 * NG + k + 1 )
REAL(DP) :: c( 1 : 2 * NG + k + 1 )
REAL(DP) :: ddmg(1), sddmg(1)

ddmg(1) = q

CALL splev(t, n, c, k, ddmg, sddmg, m, ier)

value = sddmg(1)

END FUNCTION value

REAL(DP) FUNCTION eq_nu_di_fu(y) ! eq_nu_di_fy givev values for array
IMPLICIT NONE ! to interpolate
REAL(DP) :: y
eq_nu_di_fu = 1 / (EXP(y) + 1)
END FUNCTION eq_nu_di_fu

END PROGRAM IntColl


The module Constants is there:



MODULE CONSTANTS
INTEGER, PARAMETER :: DP = SELECTED_REAL_KIND(15, 307)
INTEGER, PARAMETER :: NG = 200 ! NUMBER OF KNOTS OF GRID
INTEGER , PARAMETER :: K = 3 ! THE ORDER OF SPLINE
REAL(DP), PARAMETER :: S = 0.D+00 ! CUBIC SPLINE SMOOTHING FACTOR
END MODULE


Now, subroutines CURFIT and SPLEV appearing in above code with all their dependensies are in follow sources:



https://github.com/jbaayen/fitpackpp/tree/master/fitpack



where these subroutines are in double precision



and



http://www.netlib.org/dierckx/



where these subroutines are in single precision.



It is very important to mention that with single precision above scheme works!



Of course, if I use subroutines of single precision I modify all the types of all variables in corrisponding way.



What else have I observed:



  1. straightforward using of FUNCTION value works.


  2. If the line
    PRINT *, 'QWE'
    of the main program is commented, the value 'foo' also is not printed.










share|improve this question


























  • Use compiler checks to identify bugs. You can find many yourself. Try: gfortran -g -fbacktrace -Wall -fcheck=all and also gfortran -g -fbacktrace -fsanitize=address,zero,undefined. Compile your code with these options, re-run it and report the results.

    – Vladimir F
    Mar 26 at 20:23












  • @Vladimir F -g -fbacktrace -Wall -fcheck=all returns fpcurf.f:186:35: if(fpold-fp.gt.acc) npl1 = rn*fpms/(fpold-fp) 1 Warning: Possible change of value in conversion from REAL(8) to INTEGER(4) at (1) [-Wconversion] and -g -fbacktrace -fsanitize=address,zero,undefined returns gfortran: error: unrecognized argument to -fsanitize= option: ‘zero’

    – Vlad Yurchenko
    Mar 27 at 7:19












  • What happens if you run the program compiled with those flags?

    – Ian Bush
    Mar 27 at 7:21











  • @Ian Bush if I run the program compiled with those flags the same result is returned

    – Vlad Yurchenko
    Mar 27 at 7:25











  • I seriously doubt the output was exactly the same, there should at least be line numbers in the backtrace. Try removing the "zero" from the sanitize flag. If needed, remove also the "undefined" and re-rurn.

    – Vladimir F
    Mar 27 at 7:28

















0















I try to call subroutine SPLEV of FITPACK library through two functions ('wer' and 'qwe') nested one into another (the code is below).



The following message appears under execution of compiled program:




QWE



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



Backtrace for this error:



0 0x7F3EE4BF3E08



1 0x7F3EE4BF2F90



2 0x7F3EE453A4AF



3 0x4041B6 in splev_



4 0x400BD0 in value.3386 at pr.f90:?



5 0x400A6B in MAIN__ at pr.f90:?



Ошибка сегментирования (сделан дамп памяти)




If I compile my program with flags -g -fbacktrace -fsanitize=address,zero,undefined the follow output message appears:




QWE



0.37051690837706980



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



Backtrace for this error:



0 0x7FAB5F45CE08



1 0x7FAB5F45BF90



2 0x7FAB5EDA34AF



3 0x4075F0 in splev_ at splev.f:73 (discriminator 2)



4 0x400DDE in value.3386 at pr.f90:87



5 0x400FFA in qwe.3406 at pr.f90:43



6 0x400F88 in wer.3403 at pr.f90:48



7 0x400D08 in MAIN__ at pr.f90:38



Ошибка сегментирования (сделан дамп памяти)




If I compile my program with flags -g -fbacktrace -Wall -fcheck=all the follow output message appears:




QWE



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



Backtrace for this error:



0 0x7F2BE6F0FE08



1 0x7F2BE6F0EF90



2 0x7F2BE68564AF



3 0x4075F0 in splev_ at splev.f:73 (discriminator 2)



4 0x400DDE in value.3386 at pr.f90:87



5 0x400C46 in MAIN__ at pr.f90:35



Ошибка сегментирования (сделан дамп памяти)




If I compile my program with flags -g -fbacktrace -fsanitize=address the follow output message appears:




QWE



ASAN:SIGSEGV



=================================================================



==4796==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000 (pc 0x000000408f67 bp 0x7ffe7a134440 sp 0x7ffe7a1341e0 T0)



0 0x408f66 in splev_ /home/yurchvlad/Science/Coll_Int/F90/f90DP/1/splev.f:73



1 0x40145d in value.3386 (/home/yurchvlad/Science/Coll_Int/F90/f90DP/1/curfit+0x40145d)



2 0x4011a3 in intcoll /home/yurchvlad/Science/Coll_Int/F90/f90DP/1/pr.f90:35



3 0x401849 in main /home/yurchvlad/Science/Coll_Int/F90/f90DP/1/pr.f90:2



4 0x7fcad9b3282f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)



5 0x400d38 in _start (/home/yurchvlad/Science/Coll_Int/F90/f90DP/1/curfit+0x400d38)



AddressSanitizer can not provide additional info.



SUMMARY: AddressSanitizer: SEGV /home/yurchvlad/Science/Coll_Int/F90/f90DP/1/splev.f:73 splev_



==4796==ABORTING




Firstly I will show the code and then I will give some information about subroutines CURFIT and SPLEV of library FITPACK which are playing there a principal role.



Here is my code. This is just a test program, i.e. it is not confusion, that I interpolate there array of values of analytical function.



PROGRAM IntColl
USE Constants
IMPLICIT NONE

INTEGER :: i, nen ! i = counter
! nen, nmn, ne is sirvice variables, which
! appear on exit of CURFIT and needed on entry
! of SPLEV and SPLINT

REAL(DP) :: foo
REAL(DP) :: MOM1 ! dimensionless neutrino momentum

REAL(DP) :: dmg ( 1 : 2 * NG) ! dimensionless momentum grid
REAL(DP) :: endf( 1 : 2 * NG) ! electron neutrino distribution function
! muon neutrino distribution function
! electron and positron distribution function

REAL(DP) :: ten ( 1 : 2 * NG + k + 1) ! service arrays:
! ten is array arising on exit of working of CURFIT
! and contain knots of the spline (for endf, mndf and edf correspondingly).
REAL(DP) :: cen ( 1 : 2 * NG + k + 1) ! needed on entry of SPLEV and SPLINT
! cen appear on exit of CURFIT, contain coefficients of spline
! (for endf, mndf and edf correspondingly) and needed on entry of SPLEV and SPLINT.
REAL(DP) :: w ( 1 : 2 * NG + k + 1) ! w is array of weights for points on entry of CURFIT.

DO i = 1, 2 * NG
dmg(i) = i / 10.D+00 ! filling arrays to give their
endf(i) = eq_nu_di_fu(dmg(i)) ! on entry into subroutine
w(i) = 1.d+00 ! CURFIT
END DO

MOM1 = .53D+00
PRINT *, 'QWE'
CALL spline(dmg, endf, nen, ten, cen)
foo = value(MOM1, ten, nen, cen)
PRINT *, foo

PRINT *, wer(MOM1)
CONTAINS

REAL(DP) FUNCTION qwe(q) ! qwe and wer is "wrappers" for using
REAL(DP) :: q ! of subroutines spline > curfit
qwe = value(q, ten, nen, cen) ! in main program
END FUNCTION qwe

REAL(DP) FUNCTION wer(q)
REAL(DP) :: q
wer = qwe(q)
END FUNCTION wer

SUBROUTINE spline(x, y, n, t, c) ! spline is "hand-made wrapper" for
IMPLICIT NONE ! more convenient using of subroutine
! CURFIT in main program
INTEGER :: m, nest, n, lwrk, ier
INTEGER, PARAMETER :: iopt = 0
INTEGER :: iwrk( 1 : 10 * NG )

REAL(DP) :: xb, xe, fp
REAL(DP) :: wrk( 1 : 2 * NG * (k + 1) + (2 * NG + k + 1) * (7 + 3 * k) )
REAL(DP) :: x( 1 : 2 * NG), y(1: 2 * NG )
REAL(DP) :: t( 1 : 2 * NG + k + 1 )
REAL(DP) :: c( 1 : 2 * NG + k + 1 )

xb = 0.d+00
xe = x(2 * NG)
m = 2 * NG
nest = m + k + 1
lwrk = 2 * NG * (k + 1) + nest * (7 + 3 * k)

CALL curfit(iopt, m, x, y, w, xb, xe, k, s, nest, n, t, c, fp, wrk, lwrk, iwrk, ier)

END SUBROUTINE spline

REAL(DP) FUNCTION value(q, t, n, c) ! value is "hand-made wrapper" for
IMPLICIT NONE ! more convenient using of subroutine
! SPLEV in main program
INTEGER :: n, ier ! SPLEV should work only after
INTEGER, PARAMETER :: m = 1 ! CURFIT edned its working

REAL(DP) :: q
REAL(DP) :: t( 1 : 2 * NG + k + 1 )
REAL(DP) :: c( 1 : 2 * NG + k + 1 )
REAL(DP) :: ddmg(1), sddmg(1)

ddmg(1) = q

CALL splev(t, n, c, k, ddmg, sddmg, m, ier)

value = sddmg(1)

END FUNCTION value

REAL(DP) FUNCTION eq_nu_di_fu(y) ! eq_nu_di_fy givev values for array
IMPLICIT NONE ! to interpolate
REAL(DP) :: y
eq_nu_di_fu = 1 / (EXP(y) + 1)
END FUNCTION eq_nu_di_fu

END PROGRAM IntColl


The module Constants is there:



MODULE CONSTANTS
INTEGER, PARAMETER :: DP = SELECTED_REAL_KIND(15, 307)
INTEGER, PARAMETER :: NG = 200 ! NUMBER OF KNOTS OF GRID
INTEGER , PARAMETER :: K = 3 ! THE ORDER OF SPLINE
REAL(DP), PARAMETER :: S = 0.D+00 ! CUBIC SPLINE SMOOTHING FACTOR
END MODULE


Now, subroutines CURFIT and SPLEV appearing in above code with all their dependensies are in follow sources:



https://github.com/jbaayen/fitpackpp/tree/master/fitpack



where these subroutines are in double precision



and



http://www.netlib.org/dierckx/



where these subroutines are in single precision.



It is very important to mention that with single precision above scheme works!



Of course, if I use subroutines of single precision I modify all the types of all variables in corrisponding way.



What else have I observed:



  1. straightforward using of FUNCTION value works.


  2. If the line
    PRINT *, 'QWE'
    of the main program is commented, the value 'foo' also is not printed.










share|improve this question


























  • Use compiler checks to identify bugs. You can find many yourself. Try: gfortran -g -fbacktrace -Wall -fcheck=all and also gfortran -g -fbacktrace -fsanitize=address,zero,undefined. Compile your code with these options, re-run it and report the results.

    – Vladimir F
    Mar 26 at 20:23












  • @Vladimir F -g -fbacktrace -Wall -fcheck=all returns fpcurf.f:186:35: if(fpold-fp.gt.acc) npl1 = rn*fpms/(fpold-fp) 1 Warning: Possible change of value in conversion from REAL(8) to INTEGER(4) at (1) [-Wconversion] and -g -fbacktrace -fsanitize=address,zero,undefined returns gfortran: error: unrecognized argument to -fsanitize= option: ‘zero’

    – Vlad Yurchenko
    Mar 27 at 7:19












  • What happens if you run the program compiled with those flags?

    – Ian Bush
    Mar 27 at 7:21











  • @Ian Bush if I run the program compiled with those flags the same result is returned

    – Vlad Yurchenko
    Mar 27 at 7:25











  • I seriously doubt the output was exactly the same, there should at least be line numbers in the backtrace. Try removing the "zero" from the sanitize flag. If needed, remove also the "undefined" and re-rurn.

    – Vladimir F
    Mar 27 at 7:28













0












0








0








I try to call subroutine SPLEV of FITPACK library through two functions ('wer' and 'qwe') nested one into another (the code is below).



The following message appears under execution of compiled program:




QWE



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



Backtrace for this error:



0 0x7F3EE4BF3E08



1 0x7F3EE4BF2F90



2 0x7F3EE453A4AF



3 0x4041B6 in splev_



4 0x400BD0 in value.3386 at pr.f90:?



5 0x400A6B in MAIN__ at pr.f90:?



Ошибка сегментирования (сделан дамп памяти)




If I compile my program with flags -g -fbacktrace -fsanitize=address,zero,undefined the follow output message appears:




QWE



0.37051690837706980



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



Backtrace for this error:



0 0x7FAB5F45CE08



1 0x7FAB5F45BF90



2 0x7FAB5EDA34AF



3 0x4075F0 in splev_ at splev.f:73 (discriminator 2)



4 0x400DDE in value.3386 at pr.f90:87



5 0x400FFA in qwe.3406 at pr.f90:43



6 0x400F88 in wer.3403 at pr.f90:48



7 0x400D08 in MAIN__ at pr.f90:38



Ошибка сегментирования (сделан дамп памяти)




If I compile my program with flags -g -fbacktrace -Wall -fcheck=all the follow output message appears:




QWE



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



Backtrace for this error:



0 0x7F2BE6F0FE08



1 0x7F2BE6F0EF90



2 0x7F2BE68564AF



3 0x4075F0 in splev_ at splev.f:73 (discriminator 2)



4 0x400DDE in value.3386 at pr.f90:87



5 0x400C46 in MAIN__ at pr.f90:35



Ошибка сегментирования (сделан дамп памяти)




If I compile my program with flags -g -fbacktrace -fsanitize=address the follow output message appears:




QWE



ASAN:SIGSEGV



=================================================================



==4796==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000 (pc 0x000000408f67 bp 0x7ffe7a134440 sp 0x7ffe7a1341e0 T0)



0 0x408f66 in splev_ /home/yurchvlad/Science/Coll_Int/F90/f90DP/1/splev.f:73



1 0x40145d in value.3386 (/home/yurchvlad/Science/Coll_Int/F90/f90DP/1/curfit+0x40145d)



2 0x4011a3 in intcoll /home/yurchvlad/Science/Coll_Int/F90/f90DP/1/pr.f90:35



3 0x401849 in main /home/yurchvlad/Science/Coll_Int/F90/f90DP/1/pr.f90:2



4 0x7fcad9b3282f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)



5 0x400d38 in _start (/home/yurchvlad/Science/Coll_Int/F90/f90DP/1/curfit+0x400d38)



AddressSanitizer can not provide additional info.



SUMMARY: AddressSanitizer: SEGV /home/yurchvlad/Science/Coll_Int/F90/f90DP/1/splev.f:73 splev_



==4796==ABORTING




Firstly I will show the code and then I will give some information about subroutines CURFIT and SPLEV of library FITPACK which are playing there a principal role.



Here is my code. This is just a test program, i.e. it is not confusion, that I interpolate there array of values of analytical function.



PROGRAM IntColl
USE Constants
IMPLICIT NONE

INTEGER :: i, nen ! i = counter
! nen, nmn, ne is sirvice variables, which
! appear on exit of CURFIT and needed on entry
! of SPLEV and SPLINT

REAL(DP) :: foo
REAL(DP) :: MOM1 ! dimensionless neutrino momentum

REAL(DP) :: dmg ( 1 : 2 * NG) ! dimensionless momentum grid
REAL(DP) :: endf( 1 : 2 * NG) ! electron neutrino distribution function
! muon neutrino distribution function
! electron and positron distribution function

REAL(DP) :: ten ( 1 : 2 * NG + k + 1) ! service arrays:
! ten is array arising on exit of working of CURFIT
! and contain knots of the spline (for endf, mndf and edf correspondingly).
REAL(DP) :: cen ( 1 : 2 * NG + k + 1) ! needed on entry of SPLEV and SPLINT
! cen appear on exit of CURFIT, contain coefficients of spline
! (for endf, mndf and edf correspondingly) and needed on entry of SPLEV and SPLINT.
REAL(DP) :: w ( 1 : 2 * NG + k + 1) ! w is array of weights for points on entry of CURFIT.

DO i = 1, 2 * NG
dmg(i) = i / 10.D+00 ! filling arrays to give their
endf(i) = eq_nu_di_fu(dmg(i)) ! on entry into subroutine
w(i) = 1.d+00 ! CURFIT
END DO

MOM1 = .53D+00
PRINT *, 'QWE'
CALL spline(dmg, endf, nen, ten, cen)
foo = value(MOM1, ten, nen, cen)
PRINT *, foo

PRINT *, wer(MOM1)
CONTAINS

REAL(DP) FUNCTION qwe(q) ! qwe and wer is "wrappers" for using
REAL(DP) :: q ! of subroutines spline > curfit
qwe = value(q, ten, nen, cen) ! in main program
END FUNCTION qwe

REAL(DP) FUNCTION wer(q)
REAL(DP) :: q
wer = qwe(q)
END FUNCTION wer

SUBROUTINE spline(x, y, n, t, c) ! spline is "hand-made wrapper" for
IMPLICIT NONE ! more convenient using of subroutine
! CURFIT in main program
INTEGER :: m, nest, n, lwrk, ier
INTEGER, PARAMETER :: iopt = 0
INTEGER :: iwrk( 1 : 10 * NG )

REAL(DP) :: xb, xe, fp
REAL(DP) :: wrk( 1 : 2 * NG * (k + 1) + (2 * NG + k + 1) * (7 + 3 * k) )
REAL(DP) :: x( 1 : 2 * NG), y(1: 2 * NG )
REAL(DP) :: t( 1 : 2 * NG + k + 1 )
REAL(DP) :: c( 1 : 2 * NG + k + 1 )

xb = 0.d+00
xe = x(2 * NG)
m = 2 * NG
nest = m + k + 1
lwrk = 2 * NG * (k + 1) + nest * (7 + 3 * k)

CALL curfit(iopt, m, x, y, w, xb, xe, k, s, nest, n, t, c, fp, wrk, lwrk, iwrk, ier)

END SUBROUTINE spline

REAL(DP) FUNCTION value(q, t, n, c) ! value is "hand-made wrapper" for
IMPLICIT NONE ! more convenient using of subroutine
! SPLEV in main program
INTEGER :: n, ier ! SPLEV should work only after
INTEGER, PARAMETER :: m = 1 ! CURFIT edned its working

REAL(DP) :: q
REAL(DP) :: t( 1 : 2 * NG + k + 1 )
REAL(DP) :: c( 1 : 2 * NG + k + 1 )
REAL(DP) :: ddmg(1), sddmg(1)

ddmg(1) = q

CALL splev(t, n, c, k, ddmg, sddmg, m, ier)

value = sddmg(1)

END FUNCTION value

REAL(DP) FUNCTION eq_nu_di_fu(y) ! eq_nu_di_fy givev values for array
IMPLICIT NONE ! to interpolate
REAL(DP) :: y
eq_nu_di_fu = 1 / (EXP(y) + 1)
END FUNCTION eq_nu_di_fu

END PROGRAM IntColl


The module Constants is there:



MODULE CONSTANTS
INTEGER, PARAMETER :: DP = SELECTED_REAL_KIND(15, 307)
INTEGER, PARAMETER :: NG = 200 ! NUMBER OF KNOTS OF GRID
INTEGER , PARAMETER :: K = 3 ! THE ORDER OF SPLINE
REAL(DP), PARAMETER :: S = 0.D+00 ! CUBIC SPLINE SMOOTHING FACTOR
END MODULE


Now, subroutines CURFIT and SPLEV appearing in above code with all their dependensies are in follow sources:



https://github.com/jbaayen/fitpackpp/tree/master/fitpack



where these subroutines are in double precision



and



http://www.netlib.org/dierckx/



where these subroutines are in single precision.



It is very important to mention that with single precision above scheme works!



Of course, if I use subroutines of single precision I modify all the types of all variables in corrisponding way.



What else have I observed:



  1. straightforward using of FUNCTION value works.


  2. If the line
    PRINT *, 'QWE'
    of the main program is commented, the value 'foo' also is not printed.










share|improve this question
















I try to call subroutine SPLEV of FITPACK library through two functions ('wer' and 'qwe') nested one into another (the code is below).



The following message appears under execution of compiled program:




QWE



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



Backtrace for this error:



0 0x7F3EE4BF3E08



1 0x7F3EE4BF2F90



2 0x7F3EE453A4AF



3 0x4041B6 in splev_



4 0x400BD0 in value.3386 at pr.f90:?



5 0x400A6B in MAIN__ at pr.f90:?



Ошибка сегментирования (сделан дамп памяти)




If I compile my program with flags -g -fbacktrace -fsanitize=address,zero,undefined the follow output message appears:




QWE



0.37051690837706980



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



Backtrace for this error:



0 0x7FAB5F45CE08



1 0x7FAB5F45BF90



2 0x7FAB5EDA34AF



3 0x4075F0 in splev_ at splev.f:73 (discriminator 2)



4 0x400DDE in value.3386 at pr.f90:87



5 0x400FFA in qwe.3406 at pr.f90:43



6 0x400F88 in wer.3403 at pr.f90:48



7 0x400D08 in MAIN__ at pr.f90:38



Ошибка сегментирования (сделан дамп памяти)




If I compile my program with flags -g -fbacktrace -Wall -fcheck=all the follow output message appears:




QWE



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



Backtrace for this error:



0 0x7F2BE6F0FE08



1 0x7F2BE6F0EF90



2 0x7F2BE68564AF



3 0x4075F0 in splev_ at splev.f:73 (discriminator 2)



4 0x400DDE in value.3386 at pr.f90:87



5 0x400C46 in MAIN__ at pr.f90:35



Ошибка сегментирования (сделан дамп памяти)




If I compile my program with flags -g -fbacktrace -fsanitize=address the follow output message appears:




QWE



ASAN:SIGSEGV



=================================================================



==4796==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000 (pc 0x000000408f67 bp 0x7ffe7a134440 sp 0x7ffe7a1341e0 T0)



0 0x408f66 in splev_ /home/yurchvlad/Science/Coll_Int/F90/f90DP/1/splev.f:73



1 0x40145d in value.3386 (/home/yurchvlad/Science/Coll_Int/F90/f90DP/1/curfit+0x40145d)



2 0x4011a3 in intcoll /home/yurchvlad/Science/Coll_Int/F90/f90DP/1/pr.f90:35



3 0x401849 in main /home/yurchvlad/Science/Coll_Int/F90/f90DP/1/pr.f90:2



4 0x7fcad9b3282f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)



5 0x400d38 in _start (/home/yurchvlad/Science/Coll_Int/F90/f90DP/1/curfit+0x400d38)



AddressSanitizer can not provide additional info.



SUMMARY: AddressSanitizer: SEGV /home/yurchvlad/Science/Coll_Int/F90/f90DP/1/splev.f:73 splev_



==4796==ABORTING




Firstly I will show the code and then I will give some information about subroutines CURFIT and SPLEV of library FITPACK which are playing there a principal role.



Here is my code. This is just a test program, i.e. it is not confusion, that I interpolate there array of values of analytical function.



PROGRAM IntColl
USE Constants
IMPLICIT NONE

INTEGER :: i, nen ! i = counter
! nen, nmn, ne is sirvice variables, which
! appear on exit of CURFIT and needed on entry
! of SPLEV and SPLINT

REAL(DP) :: foo
REAL(DP) :: MOM1 ! dimensionless neutrino momentum

REAL(DP) :: dmg ( 1 : 2 * NG) ! dimensionless momentum grid
REAL(DP) :: endf( 1 : 2 * NG) ! electron neutrino distribution function
! muon neutrino distribution function
! electron and positron distribution function

REAL(DP) :: ten ( 1 : 2 * NG + k + 1) ! service arrays:
! ten is array arising on exit of working of CURFIT
! and contain knots of the spline (for endf, mndf and edf correspondingly).
REAL(DP) :: cen ( 1 : 2 * NG + k + 1) ! needed on entry of SPLEV and SPLINT
! cen appear on exit of CURFIT, contain coefficients of spline
! (for endf, mndf and edf correspondingly) and needed on entry of SPLEV and SPLINT.
REAL(DP) :: w ( 1 : 2 * NG + k + 1) ! w is array of weights for points on entry of CURFIT.

DO i = 1, 2 * NG
dmg(i) = i / 10.D+00 ! filling arrays to give their
endf(i) = eq_nu_di_fu(dmg(i)) ! on entry into subroutine
w(i) = 1.d+00 ! CURFIT
END DO

MOM1 = .53D+00
PRINT *, 'QWE'
CALL spline(dmg, endf, nen, ten, cen)
foo = value(MOM1, ten, nen, cen)
PRINT *, foo

PRINT *, wer(MOM1)
CONTAINS

REAL(DP) FUNCTION qwe(q) ! qwe and wer is "wrappers" for using
REAL(DP) :: q ! of subroutines spline > curfit
qwe = value(q, ten, nen, cen) ! in main program
END FUNCTION qwe

REAL(DP) FUNCTION wer(q)
REAL(DP) :: q
wer = qwe(q)
END FUNCTION wer

SUBROUTINE spline(x, y, n, t, c) ! spline is "hand-made wrapper" for
IMPLICIT NONE ! more convenient using of subroutine
! CURFIT in main program
INTEGER :: m, nest, n, lwrk, ier
INTEGER, PARAMETER :: iopt = 0
INTEGER :: iwrk( 1 : 10 * NG )

REAL(DP) :: xb, xe, fp
REAL(DP) :: wrk( 1 : 2 * NG * (k + 1) + (2 * NG + k + 1) * (7 + 3 * k) )
REAL(DP) :: x( 1 : 2 * NG), y(1: 2 * NG )
REAL(DP) :: t( 1 : 2 * NG + k + 1 )
REAL(DP) :: c( 1 : 2 * NG + k + 1 )

xb = 0.d+00
xe = x(2 * NG)
m = 2 * NG
nest = m + k + 1
lwrk = 2 * NG * (k + 1) + nest * (7 + 3 * k)

CALL curfit(iopt, m, x, y, w, xb, xe, k, s, nest, n, t, c, fp, wrk, lwrk, iwrk, ier)

END SUBROUTINE spline

REAL(DP) FUNCTION value(q, t, n, c) ! value is "hand-made wrapper" for
IMPLICIT NONE ! more convenient using of subroutine
! SPLEV in main program
INTEGER :: n, ier ! SPLEV should work only after
INTEGER, PARAMETER :: m = 1 ! CURFIT edned its working

REAL(DP) :: q
REAL(DP) :: t( 1 : 2 * NG + k + 1 )
REAL(DP) :: c( 1 : 2 * NG + k + 1 )
REAL(DP) :: ddmg(1), sddmg(1)

ddmg(1) = q

CALL splev(t, n, c, k, ddmg, sddmg, m, ier)

value = sddmg(1)

END FUNCTION value

REAL(DP) FUNCTION eq_nu_di_fu(y) ! eq_nu_di_fy givev values for array
IMPLICIT NONE ! to interpolate
REAL(DP) :: y
eq_nu_di_fu = 1 / (EXP(y) + 1)
END FUNCTION eq_nu_di_fu

END PROGRAM IntColl


The module Constants is there:



MODULE CONSTANTS
INTEGER, PARAMETER :: DP = SELECTED_REAL_KIND(15, 307)
INTEGER, PARAMETER :: NG = 200 ! NUMBER OF KNOTS OF GRID
INTEGER , PARAMETER :: K = 3 ! THE ORDER OF SPLINE
REAL(DP), PARAMETER :: S = 0.D+00 ! CUBIC SPLINE SMOOTHING FACTOR
END MODULE


Now, subroutines CURFIT and SPLEV appearing in above code with all their dependensies are in follow sources:



https://github.com/jbaayen/fitpackpp/tree/master/fitpack



where these subroutines are in double precision



and



http://www.netlib.org/dierckx/



where these subroutines are in single precision.



It is very important to mention that with single precision above scheme works!



Of course, if I use subroutines of single precision I modify all the types of all variables in corrisponding way.



What else have I observed:



  1. straightforward using of FUNCTION value works.


  2. If the line
    PRINT *, 'QWE'
    of the main program is commented, the value 'foo' also is not printed.







fortran gfortran






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Mar 27 at 12:05







Vlad Yurchenko

















asked Mar 26 at 17:55









Vlad YurchenkoVlad Yurchenko

11 bronze badge




11 bronze badge















  • Use compiler checks to identify bugs. You can find many yourself. Try: gfortran -g -fbacktrace -Wall -fcheck=all and also gfortran -g -fbacktrace -fsanitize=address,zero,undefined. Compile your code with these options, re-run it and report the results.

    – Vladimir F
    Mar 26 at 20:23












  • @Vladimir F -g -fbacktrace -Wall -fcheck=all returns fpcurf.f:186:35: if(fpold-fp.gt.acc) npl1 = rn*fpms/(fpold-fp) 1 Warning: Possible change of value in conversion from REAL(8) to INTEGER(4) at (1) [-Wconversion] and -g -fbacktrace -fsanitize=address,zero,undefined returns gfortran: error: unrecognized argument to -fsanitize= option: ‘zero’

    – Vlad Yurchenko
    Mar 27 at 7:19












  • What happens if you run the program compiled with those flags?

    – Ian Bush
    Mar 27 at 7:21











  • @Ian Bush if I run the program compiled with those flags the same result is returned

    – Vlad Yurchenko
    Mar 27 at 7:25











  • I seriously doubt the output was exactly the same, there should at least be line numbers in the backtrace. Try removing the "zero" from the sanitize flag. If needed, remove also the "undefined" and re-rurn.

    – Vladimir F
    Mar 27 at 7:28

















  • Use compiler checks to identify bugs. You can find many yourself. Try: gfortran -g -fbacktrace -Wall -fcheck=all and also gfortran -g -fbacktrace -fsanitize=address,zero,undefined. Compile your code with these options, re-run it and report the results.

    – Vladimir F
    Mar 26 at 20:23












  • @Vladimir F -g -fbacktrace -Wall -fcheck=all returns fpcurf.f:186:35: if(fpold-fp.gt.acc) npl1 = rn*fpms/(fpold-fp) 1 Warning: Possible change of value in conversion from REAL(8) to INTEGER(4) at (1) [-Wconversion] and -g -fbacktrace -fsanitize=address,zero,undefined returns gfortran: error: unrecognized argument to -fsanitize= option: ‘zero’

    – Vlad Yurchenko
    Mar 27 at 7:19












  • What happens if you run the program compiled with those flags?

    – Ian Bush
    Mar 27 at 7:21











  • @Ian Bush if I run the program compiled with those flags the same result is returned

    – Vlad Yurchenko
    Mar 27 at 7:25











  • I seriously doubt the output was exactly the same, there should at least be line numbers in the backtrace. Try removing the "zero" from the sanitize flag. If needed, remove also the "undefined" and re-rurn.

    – Vladimir F
    Mar 27 at 7:28
















Use compiler checks to identify bugs. You can find many yourself. Try: gfortran -g -fbacktrace -Wall -fcheck=all and also gfortran -g -fbacktrace -fsanitize=address,zero,undefined. Compile your code with these options, re-run it and report the results.

– Vladimir F
Mar 26 at 20:23






Use compiler checks to identify bugs. You can find many yourself. Try: gfortran -g -fbacktrace -Wall -fcheck=all and also gfortran -g -fbacktrace -fsanitize=address,zero,undefined. Compile your code with these options, re-run it and report the results.

– Vladimir F
Mar 26 at 20:23














@Vladimir F -g -fbacktrace -Wall -fcheck=all returns fpcurf.f:186:35: if(fpold-fp.gt.acc) npl1 = rn*fpms/(fpold-fp) 1 Warning: Possible change of value in conversion from REAL(8) to INTEGER(4) at (1) [-Wconversion] and -g -fbacktrace -fsanitize=address,zero,undefined returns gfortran: error: unrecognized argument to -fsanitize= option: ‘zero’

– Vlad Yurchenko
Mar 27 at 7:19






@Vladimir F -g -fbacktrace -Wall -fcheck=all returns fpcurf.f:186:35: if(fpold-fp.gt.acc) npl1 = rn*fpms/(fpold-fp) 1 Warning: Possible change of value in conversion from REAL(8) to INTEGER(4) at (1) [-Wconversion] and -g -fbacktrace -fsanitize=address,zero,undefined returns gfortran: error: unrecognized argument to -fsanitize= option: ‘zero’

– Vlad Yurchenko
Mar 27 at 7:19














What happens if you run the program compiled with those flags?

– Ian Bush
Mar 27 at 7:21





What happens if you run the program compiled with those flags?

– Ian Bush
Mar 27 at 7:21













@Ian Bush if I run the program compiled with those flags the same result is returned

– Vlad Yurchenko
Mar 27 at 7:25





@Ian Bush if I run the program compiled with those flags the same result is returned

– Vlad Yurchenko
Mar 27 at 7:25













I seriously doubt the output was exactly the same, there should at least be line numbers in the backtrace. Try removing the "zero" from the sanitize flag. If needed, remove also the "undefined" and re-rurn.

– Vladimir F
Mar 27 at 7:28





I seriously doubt the output was exactly the same, there should at least be line numbers in the backtrace. Try removing the "zero" from the sanitize flag. If needed, remove also the "undefined" and re-rurn.

– Vladimir F
Mar 27 at 7:28












0






active

oldest

votes










Your Answer






StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");

StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);













draft saved

draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55363485%2fwhy-does-segmentation-fault-arise-in-fortran-under-calling-subroutine-nested-gra%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes




Is this question similar to what you get asked at work? Learn more about asking and sharing private information with your coworkers using Stack Overflow for Teams.







Is this question similar to what you get asked at work? Learn more about asking and sharing private information with your coworkers using Stack Overflow for Teams.



















draft saved

draft discarded
















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid


  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55363485%2fwhy-does-segmentation-fault-arise-in-fortran-under-calling-subroutine-nested-gra%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Kamusi Yaliyomo Aina za kamusi | Muundo wa kamusi | Faida za kamusi | Dhima ya picha katika kamusi | Marejeo | Tazama pia | Viungo vya nje | UrambazajiKuhusu kamusiGo-SwahiliWiki-KamusiKamusi ya Kiswahili na Kiingerezakuihariri na kuongeza habari

Swift 4 - func physicsWorld not invoked on collision? The Next CEO of Stack OverflowHow to call Objective-C code from Swift#ifdef replacement in the Swift language@selector() in Swift?#pragma mark in Swift?Swift for loop: for index, element in array?dispatch_after - GCD in Swift?Swift Beta performance: sorting arraysSplit a String into an array in Swift?The use of Swift 3 @objc inference in Swift 4 mode is deprecated?How to optimize UITableViewCell, because my UITableView lags

Access current req object everywhere in Node.js ExpressWhy are global variables considered bad practice? (node.js)Using req & res across functionsHow do I get the path to the current script with Node.js?What is Node.js' Connect, Express and “middleware”?Node.js w/ express error handling in callbackHow to access the GET parameters after “?” in Express?Modify Node.js req object parametersAccess “app” variable inside of ExpressJS/ConnectJS middleware?Node.js Express app - request objectAngular Http Module considered middleware?Session variables in ExpressJSAdd properties to the req object in expressjs with Typescript