hpfem/hermes

Valgrind analysis: Delete of void-ptr is undefined behavior!

Closed this issue · 1 comments

When I run my mode-solver code which uses hermes2d, I sometimes get spurious crashes or seg-faults. When I use valgrind to search for the cause of those problems, I find a number of problems. I will add them as separate issues.

The first one is this one:

==16999== at 0x4C2A4BC: operator delete(void_) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==16999== by 0x56E0E6B: Hermes::Hermes2D::Spacestd::complex::free_bc_data() (space.cpp:1135)
==16999== by 0x56EA390: Hermes::Hermes2D::Spacestd::complex::assign_dofs(int, int) (space.cpp:923)
==16999== by 0x56E7187: Hermes::Hermes2D::Spacestd::complex::ReferenceSpaceCreator::create_ref_space(bool) (space.cpp:692)
==16999== by 0x44D36E: main (WaveguideModeSolverAdaptiveIterative.cpp:202)
==16999== Address 0xe7c42e0 is 0 bytes inside a block of size 32 alloc'd
==16999== at 0x4C2AC27: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==16999== by 0x56F0B83: Hermes::Hermes2D::HcurlSpacestd::complex::get_bc_projection(Hermes::Hermes2D::SurfPos_, int, Hermes::Hermes2D::EssentialBoundaryConditionstd::complex) (space_hcurl.cpp:185)
==16999== by 0x56E9E8A: Hermes::Hermes2D::Spacestd::complex::update_edge_bc(Hermes::Hermes2D::Element
, Hermes::Hermes2D::SurfPos_) (space.cpp:1088)
==16999== by 0x56E9FB5: Hermes::Hermes2D::Spacestd::complex::update_edge_bc(Hermes::Hermes2D::Element_, Hermes::Hermes2D::SurfPos_) (space.cpp:1104)
==16999== by 0x56EA16E: Hermes::Hermes2D::Spacestd::complex::update_essential_bc_values() (space.cpp:1125)
==16999== by 0x56EA398: Hermes::Hermes2D::Spacestd::complex::assign_dofs(int, int) (space.cpp:924)
==16999== by 0x56F02A0: Hermes::Hermes2D::HcurlSpacestd::complex::HcurlSpace(Hermes::Hermes2D::Mesh const_, Hermes::Hermes2D::EssentialBCsstd::complex, int, Hermes::Hermes2D::Shapeset) (space_hcurl.cpp:56)
==16999== by 0x56E6F73: Hermes::Hermes2D::Spacestd::complex::ReferenceSpaceCreator::init_construction_hcurl() (space.cpp:725)
==16999== by 0x56E7125: Hermes::Hermes2D::Spacestd::complex::ReferenceSpaceCreator::create_ref_space(bool) (space.cpp:677)

The reason here seems to be the delete of a void* which is not a good idea. Actually, it is undefined behavior (e.g. see http://stackoverflow.com/questions/941832/is-it-safe-to-delete-a-void-pointer)

The pointers in question are bc_data[], defined in hermes2d/include/space/space.h as Hermes::vector<void*> bc_data; I tried converting them to Hermes::vector<Scalar*> bc_data but that caused some problems and I do not have the necessary insight into hermes2d to fix this problem.

Fixed.