Справка по выходу Fortran90 valgrind. Необъяснимая ошибка, возникающая в начале выполнения кода
В настоящее время я пишу большой нелинейный решатель для неприятного уравнения в частных производных в Fortran90 как часть моего исследования. Я столкнулся с проблемой, в которой, по моему мнению, проблема с повреждением памяти мешает моему коду, и я пытаюсь ее отследить; чтобы сделать это, я решил использовать valgrind, так как это работало для меня в прошлом. К сожалению, я получаю необъяснимое сообщение об ошибке, которое происходит в самом начале выполнения моего кода, см. Ниже:
==18257== Memcheck, a memory error detector
==18257== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==18257== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==18257== Command: ./JFNKsolver
==18257==
==18257== Conditional jump or move depends on uninitialised value(s)
==18257== at 0x6F7F7D: __intel_sse2_strcpy (in /home/cseinen/Documents/1_Thesis_Work/ThesisGit/Model/Source_Code/JFNKsolver)
==18257== by 0x6AA1C0: for__open_proc (in /home/cseinen/Documents/1_Thesis_Work/ThesisGit/Model/Source_Code/JFNKsolver)
==18257== by 0x67EF6C: for__open_default (in /home/cseinen/Documents/1_Thesis_Work/ThesisGit/Model/Source_Code/JFNKsolver)
==18257== by 0x69878D: for_write_seq_lis (in /home/cseinen/Documents/1_Thesis_Work/ThesisGit/Model/Source_Code/JFNKsolver)
==18257== by 0x65BA69: MAIN__ (JFNKsolver.f90:146)
==18257== by 0x402DAD: main (in /home/cseinen/Documents/1_Thesis_Work/ThesisGit/Model/Source_Code/JFNKsolver)
==18257== Uninitialised value was created by a stack allocation
==18257== at 0x6AA07D: for__open_proc (in /home/cseinen/Documents/1_Thesis_Work/ThesisGit/Model/Source_Code/JFNKsolver)
==18257==
==18257== Conditional jump or move depends on uninitialised value(s)
==18257== at 0x6F7F7D: __intel_sse2_strcpy (in /home/cseinen/Documents/1_Thesis_Work/ThesisGit/Model/Source_Code/JFNKsolver)
==18257== by 0x677DA5: for__add_to_lf_table (in /home/cseinen/Documents/1_Thesis_Work/ThesisGit/Model/Source_Code/JFNKsolver)
==18257== by 0x6ABA13: for__open_proc (in /home/cseinen/Documents/1_Thesis_Work/ThesisGit/Model/Source_Code/JFNKsolver)
==18257== by 0x67EF6C: for__open_default (in /home/cseinen/Documents/1_Thesis_Work/ThesisGit/Model/Source_Code/JFNKsolver)
==18257== by 0x69878D: for_write_seq_lis (in /home/cseinen/Documents/1_Thesis_Work/ThesisGit/Model/Source_Code/JFNKsolver)
==18257== by 0x65BA69: MAIN__ (JFNKsolver.f90:146)
==18257== by 0x402DAD: main (in /home/cseinen/Documents/1_Thesis_Work/ThesisGit/Model/Source_Code/JFNKsolver)
==18257== Uninitialised value was created by a stack allocation
==18257== at 0x6AA07D: for__open_proc (in /home/cseinen/Documents/1_Thesis_Work/ThesisGit/Model/Source_Code/JFNKsolver)
==18257==
Я получил эту ошибку, запустив мой код с valgrind --track-origins=yes ./JFNKsolver
,
Теперь я знаю, что, как правило, эти ошибки означают, что где-то используется неинициализированная переменная, но странно то, что она появляется до того, как что-то действительно происходит в моем коде, и она указывает через by 0x65BA69: MAIN__ (JFNKsolver.f90:146)
в пробную выписку, т.е. print *, "Test"
в коде ниже.
program JFNKsolver
use modelparams
use initialization
use forcing
use domain_routines
use solver_routines
use var_routines
use csv_file
use validation_routines
use validsoln_routines
implicit none
real(kind = dbl_kind) :: &
time, &
norm_test
integer(kind = int_kind) :: &
nxT, nyT, &
nxN, nyN, &
nxU, nyU, &
nxV, nyV, &
nt, &
nU_pnts, &
nV_pnts, &
nT_pnts, &
nN_pnts, &
nHT_pnts, &
nHN_pnts, &
si, &
tmp_size, &
i, j, ij
integer(kind = int_kind), allocatable, dimension (:) :: &
indxUi, indxUj, &
indxVi, indxVj, &
indxTi, indxTj, &
indxNi, indxNj, &
haloTi, haloTj, &
haloNi, haloNj
real(kind = dbl_kind), allocatable, dimension (:) :: &
Au, res_NL, u_update, &
b, b_0, vpb_forc
integer(kind = int_kind), allocatable, dimension (:,:,:) :: &
ulmsk, vlmsk, &
uimsk, vimsk, &
Timsk, Nimsk, &
Tlmsk, Nlmsk
real(kind = dbl_kind), allocatable, dimension (:,:) :: &
ugrid, vgrid, &
uResgrid, vResgrid, &
uocn_u, uocn_v, &
vocn_u, vocn_v, &
uwnd_u, uwnd_v, &
vwnd_u, vwnd_v, &
h_u, h_v, h_T, &
A_T, &
P_T, P_N, &
zeta_T, zeta_N, &
eta_T, eta_N, &
Cw_u, Cw_v, &
dist_T, dist_N, &
dist_gx_T, &
dist_gy_T
print *, "Test"
Обратите внимание, что я удалил комментарии, чтобы очистить это, и переменные вида инициализируются в модуле modelparams. Кто-нибудь может дать некоторое представление о том, что может быть причиной этого? Может ли это быть связано с модулями, которые я использую через use
заявления? Изначально я думал, что это проблема с valgrind, но теперь, когда я вижу последствия повреждения памяти и тот факт, что это единственная ошибка, которую я вижу, я стал настороженно относиться к ней.
Примечание: причина, по которой я полагаю, что есть проблема повреждения памяти, заключается в том, что я вижу изменение в поведении моего решателя просто из-за наличия кода, который не должен ничего менять. Это была функциональность, которую я добавил, чтобы помочь проверить код, и я провел обширные тесты по этому вопросу.
1 ответ
По сути, Стив Лайонел отвечает на ту же проблему в Intel Developer Zone.
Вот пример используемой программы:
Program Main
implicit none
write(*,*) "123"
End Program
Составлено с:
$ ifort -g main.f90
Затем позвонил с:
$ valgrind -v --track-origins=yes --leak-check=full ./a.out
Valgrind возвращает практически тот же результат, что и выше.
Вот ответ Стива полностью.
Да вы правы. Вы неявно открыли файл, который требует выделенной памяти. Файл не закрыт, поэтому память остается выделенной в конце программы. Даже если файл закрыт (и при выходе из программы происходит неявное закрытие, не вся память бухгалтерии может быть освобождена. Valgrind не понимает Fortran.
Возможно, вы не сможете избавиться от всех жалоб Valgrind.
Так что, будь я на вашем месте, я бы проигнорировал эти предупреждения и посмотрел бы на любые другие, которые вы можете иметь.