Справка по выходу 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.

Так что, будь я на вашем месте, я бы проигнорировал эти предупреждения и посмотрел бы на любые другие, которые вы можете иметь.

Другие вопросы по тегам