hpfem/hermes

Valgrind analysis: Out of bounds/Segmentation Fault

Closed this issue · 1 comments

The same valgrind analysis used to identify issue #114 also yielded the more problematic one (which seems to be responsible for several crashes I experienced)!

==16999== Invalid write of size 8
==16999== at 0x55850C7: Hermes::Hermes2D::RefinementSelectors::HcurlProjBasedSelectorstd::complex::precalc_ref_solution(int, Hermes::Hermes2D::Solutionstd::complex, Hermes::Hermes2D::Element, int) (hcurl_proj_based_selector.cpp:223)
==16999== by 0x557C161: Hermes::Hermes2D::RefinementSelectors::ProjBasedSelectorstd::complex::calc_projection_errors(Hermes::Hermes2D::Element_, Hermes::Hermes2D::RefinementSelectors::OptimumSelectorstd::complex::CandsInfo const&, Hermes::Hermes2D::RefinementSelectors::OptimumSelectorstd::complex::CandsInfo const&, Hermes::Hermes2D::RefinementSelectors::OptimumSelectorstd::complex::CandsInfo const&, Hermes::Hermes2D::Solutionstd::complex, double () [12][12], double () [12], double () [12][12]) (proj_based_selector.cpp:265)
==16999== by 0x55745C1: Hermes::Hermes2D::RefinementSelectors::ProjBasedSelectorstd::complex::evaluate_cands_error(Hermes::Hermes2D::Element_, Hermes::Hermes2D::Solutionstd::complex, double, double_) (proj_based_selector.cpp:136)
==16999== by 0x556E131: Hermes::Hermes2D::RefinementSelectors::OptimumSelectorstd::complex::evaluate_candidates(Hermes::Hermes2D::Element_, Hermes::Hermes2D::Solutionstd::complex, double, double_) (optimum_selector.cpp:602)
==16999== by 0x556E233: Hermes::Hermes2D::RefinementSelectors::OptimumSelectorstd::complex::select_refinement(Hermes::Hermes2D::Element_, int, Hermes::Hermes2D::Solutionstd::complex, Hermes::Hermes2D::ElementToRefine&) (optimum_selector.cpp:707)
==16999== by 0x548F72F: ZN6Hermes8Hermes2D5AdaptISt7complexIdEE5adaptENS_6vectorIPNS0_19RefinementSelectors8SelectorIS3_EEEEdiid.omp_fn.0 (adapt.cpp:355)
==16999== by 0x6F85EE9: ??? (in /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0)
==16999== by 0x4E39E99: start_thread (pthread_create.c:308)
==16999== by 0x688CCCC: clone (clone.S:112)
==16999== Address 0x14e40970 is 0 bytes after a block of size 5,088 alloc'd
==16999== at 0x4C2AC27: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==16999== by 0x5585158: Hermes::Hermes2D::RefinementSelectors::HcurlProjBasedSelectorstd::complex::precalc_ref_solution(int, Hermes::Hermes2D::Solutionstd::complex
, Hermes::Hermes2D::Element
, int) (matrix.h:55)
==16999== by 0x557C07A: Hermes::Hermes2D::RefinementSelectors::ProjBasedSelectorstd::complex::calc_projection_errors(Hermes::Hermes2D::Element
, Hermes::Hermes2D::RefinementSelectors::OptimumSelectorstd::complex::CandsInfo const&, Hermes::Hermes2D::RefinementSelectors::OptimumSelectorstd::complex::CandsInfo const&, Hermes::Hermes2D::RefinementSelectors::OptimumSelectorstd::complex::CandsInfo const&, Hermes::Hermes2D::Solutionstd::complex, double () [12][12], double () [12], double () [12][12]) (proj_based_selector.cpp:279)
==16999== by 0x55745C1: Hermes::Hermes2D::RefinementSelectors::ProjBasedSelectorstd::complex::evaluate_cands_error(Hermes::Hermes2D::Element_, Hermes::Hermes2D::Solutionstd::complex, double, double_) (proj_based_selector.cpp:136)
==16999== by 0x556E131: Hermes::Hermes2D::RefinementSelectors::OptimumSelectorstd::complex::evaluate_candidates(Hermes::Hermes2D::Element_, Hermes::Hermes2D::Solutionstd::complex, double, double_) (optimum_selector.cpp:602)
==16999== by 0x556E233: Hermes::Hermes2D::RefinementSelectors::OptimumSelectorstd::complex::select_refinement(Hermes::Hermes2D::Element_, int, Hermes::Hermes2D::Solutionstd::complex_, Hermes::Hermes2D::ElementToRefine&) (optimum_selector.cpp:707)
==16999== by 0x548F72F: _ZN6Hermes8Hermes2D5AdaptISt7complexIdEE5adaptENS_6vectorIPNS0_19RefinementSelectors8SelectorIS3_EEEEdiid._omp_fn.0 (adapt.cpp:355)
==16999== by 0x6F85EE9: ??? (in /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0)
==16999== by 0x4E39E99: start_thread (pthread_create.c:308)
==16999== by 0x688CCCC: clone (clone.S:112)

As shown above, in (hcurl_proj_based_selector.cpp:223) the code writes to curl[i] which is allocated as

//allocate space for Curl
if(precalc_rvals_curl == NULL)
precalc_rvals_curl = new_matrix(H2D_MAX_ELEMENT_SONS, num_gip);

The problems seems to be that num_gip can change during the runtime of the code, but the allocation is fixed! The obvious patch would be to always delete and reallocate precalc_rvals_curl with the current num_gip but I am not sure if this breaks something.

Update: Problem only seems to occur when using mixed triangular-quad-meshes and only when h- or hp-adaptivity is used!

Fixed.