As pointed out by upstream, one must export the following: <quote> You should set the environment variable ICONV_MAX_REUSE to zero before running such tests:
export ICONV_MAX_REUSE=0 valgrind --leak-check=full ... <quote> Which gives now the reduced set of leaks: % valgrind --leak-check=full --show-leak-kinds=all dcm2json charsettests/SCSARAB output.json ==1928491== Memcheck, a memory error detector ==1928491== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al. ==1928491== Using Valgrind-3.19.0 and LibVEX; rerun with -h for copyright info ==1928491== Command: dcm2json charsettests/SCSARAB output.json ==1928491== ==1928491== ==1928491== HEAP SUMMARY: ==1928491== in use at exit: 842 bytes in 2 blocks ==1928491== total heap usage: 80,067 allocs, 80,065 frees, 2,124,652 bytes allocated ==1928491== ==1928491== 26 bytes in 1 blocks are still reachable in loss record 1 of 2 ==1928491== at 0x48407B4: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==1928491== by 0x4E037F9: strdup (strdup.c:42) ==1928491== by 0x4F5C7F1: UnknownInlinedFun (citrus_mapper.c:119) ==1928491== by 0x4F5C7F1: _citrus_csmapper_open.constprop.0 (citrus_csmapper.c:388) ==1928491== by 0x4F55B54: UnknownInlinedFun (citrus_iconv_std.c:186) ==1928491== by 0x4F55B54: UnknownInlinedFun (citrus_iconv_std.c:225) ==1928491== by 0x4F55B54: UnknownInlinedFun (citrus_iconv_std.c:283) ==1928491== by 0x4F55B54: _citrus_iconv_std_iconv_init_shared (citrus_iconv_std.c:382) ==1928491== by 0x4F56B83: UnknownInlinedFun (citrus_iconv.c:201) ==1928491== by 0x4F56B83: UnknownInlinedFun (citrus_iconv.c:265) ==1928491== by 0x4F56B83: _citrus_iconv_open (citrus_iconv.c:349) ==1928491== by 0x4F59117: _iconv_open (oficonv_iconv.c:107) ==1928491== by 0x4AE71E2: UnknownInlinedFun (ofchrenc.cc:337) ==1928491== by 0x4AE71E2: OFCharacterEncoding::selectEncoding(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (ofchrenc.cc:785) ==1928491== by 0x49B5F63: DcmSpecificCharacterSet::selectCharacterSetWithoutCodeExtensions() (dcspchrs.cc:338) ==1928491== by 0x49B6797: DcmSpecificCharacterSet::selectCharacterSet(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (dcspchrs.cc:189) ==1928491== by 0x498F5A6: DcmItem::convertCharacterSet(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long, bool) (dcitem.cc:4403) ==1928491== by 0x498CB96: DcmItem::convertCharacterSet(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long, bool) (dcitem.cc:4442) ==1928491== by 0x498A83C: DcmItem::convertToUTF8() (dcitem.cc:4465) ==1928491== ==1928491== 816 bytes in 1 blocks are still reachable in loss record 2 of 2 ==1928491== at 0x48407B4: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==1928491== by 0x4F5C7DD: UnknownInlinedFun (citrus_mapper.c:114) ==1928491== by 0x4F5C7DD: _citrus_csmapper_open.constprop.0 (citrus_csmapper.c:388) ==1928491== by 0x4F55B54: UnknownInlinedFun (citrus_iconv_std.c:186) ==1928491== by 0x4F55B54: UnknownInlinedFun (citrus_iconv_std.c:225) ==1928491== by 0x4F55B54: UnknownInlinedFun (citrus_iconv_std.c:283) ==1928491== by 0x4F55B54: _citrus_iconv_std_iconv_init_shared (citrus_iconv_std.c:382) ==1928491== by 0x4F56B83: UnknownInlinedFun (citrus_iconv.c:201) ==1928491== by 0x4F56B83: UnknownInlinedFun (citrus_iconv.c:265) ==1928491== by 0x4F56B83: _citrus_iconv_open (citrus_iconv.c:349) ==1928491== by 0x4F59117: _iconv_open (oficonv_iconv.c:107) ==1928491== by 0x4AE71E2: UnknownInlinedFun (ofchrenc.cc:337) ==1928491== by 0x4AE71E2: OFCharacterEncoding::selectEncoding(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (ofchrenc.cc:785) ==1928491== by 0x49B5F63: DcmSpecificCharacterSet::selectCharacterSetWithoutCodeExtensions() (dcspchrs.cc:338) ==1928491== by 0x49B6797: DcmSpecificCharacterSet::selectCharacterSet(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (dcspchrs.cc:189) ==1928491== by 0x498F5A6: DcmItem::convertCharacterSet(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long, bool) (dcitem.cc:4403) ==1928491== by 0x498CB96: DcmItem::convertCharacterSet(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long, bool) (dcitem.cc:4442) ==1928491== by 0x498A83C: DcmItem::convertToUTF8() (dcitem.cc:4465) ==1928491== by 0x10C7D3: main (dcm2json.cc:281) ==1928491== ==1928491== LEAK SUMMARY: ==1928491== definitely lost: 0 bytes in 0 blocks ==1928491== indirectly lost: 0 bytes in 0 blocks ==1928491== possibly lost: 0 bytes in 0 blocks ==1928491== still reachable: 842 bytes in 2 blocks ==1928491== suppressed: 0 bytes in 0 blocks ==1928491== ==1928491== For lists of detected and suppressed errors, rerun with: -s ==1928491== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)