I am working with some original code that reads directly from disk files. There is only one malloc call in the entire beginning code (and I checked that that is no the issue). In my own code, I do not use malloc, strdup, or any other heap calls. However, running valgrind with a full leak check I still get (below).
I don’t recognize any of the files that it is showing. I am running this on a Mac OSX with Lion. Is it possible that this is a problem with the system libraries or is their another way to troubleshoot this. I know that some will argue that having reachable memory is okay, but I am curious to know why any of the memory is reachable still.
-
-90966-- REDIR: 0x3a46c7 (free) redirected to 0x55b8 (free)
==90966==
==90966== HEAP SUMMARY:
==90966== in use at exit: 6,383 bytes in 33 blocks
==90966== total heap usage: 34 allocs, 1 frees, 6,899 bytes allocated
==90966==
==90966== Searching for pointers to 33 not-freed blocks
==90966== Checked 684,888 bytes
==90966==
==90966== 8 bytes in 1 blocks are still reachable in loss record 1 of 9
==90966== at 0x5237: malloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==90966== by 0x7FFF5FC11C2A: malloc (in /usr/lib/dyld)
==90966== by 0x7FFF5FC19C4E: operator new(unsigned long) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0817E: std::vector<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), std::allocator<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*)> >::_M_insert_aux(__gnu_cxx::__normal_iterator<char const* (**)(dyld_image_states, unsigned int, dyld_image_info const*), std::vector<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), std::allocator<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*)> > >, char const* (* const&)(dyld_image_states, unsigned int, dyld_image_info const*)) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC08260: std::vector<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), std::allocator<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*)> >::insert(__gnu_cxx::__normal_iterator<char const* (**)(dyld_image_states, unsigned int, dyld_image_info const*), std::vector<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), std::allocator<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*)> > >, char const* (* const&)(dyld_image_states, unsigned int, dyld_image_info const*)) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC054FA: dyld::registerImageStateBatchChangeHandler(dyld_image_states, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*)) (in /usr/lib/dyld)
==90966== by 0x2C1ACB: dyld_register_image_state_change_handler (in /usr/lib/system/libdyld.dylib)
==90966== by 0x2C2ACB: _dyld_initializer (in /usr/lib/system/libdyld.dylib)
==90966== by 0x1CFE73: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==90966== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966==
==90966== 87 bytes in 7 blocks are still reachable in loss record 2 of 9
==90966== at 0x5237: malloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==90966== by 0x342358: strdup (in /usr/lib/system/libsystem_c.dylib)
==90966== by 0x4E7802: _xpc_strdup (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EDCCF: _xpc_dictionary_insert (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EDE0E: xpc_dictionary_set_string (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EFE8C: _libxpc_initializer (in /usr/lib/system/libxpc.dylib)
==90966== by 0x1CFE7D: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==90966== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966==
==90966== 88 bytes in 1 blocks are still reachable in loss record 3 of 9
==90966== at 0x5237: malloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==90966== by 0x2CA9B0: get_or_create_key_element (in /usr/lib/system/libkeymgr.dylib)
==90966== by 0x2CABC9: _keymgr_get_and_lock_processwide_ptr_2 (in /usr/lib/system/libkeymgr.dylib)
==90966== by 0x2CAC36: __keymgr_initializer (in /usr/lib/system/libkeymgr.dylib)
==90966== by 0x1CFE6E: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==90966== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC034B7: dyld::initializeMainExecutable() (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0760A: dyld::_main(macho_header const*, unsigned long, int, char const**, char const**, char const**) (in /usr/lib/dyld)
==90966==
==90966== 136 bytes in 1 blocks are still reachable in loss record 4 of 9
==90966== at 0x58DE: calloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==90966== by 0x4E78FA: _xpc_calloc (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4E81D4: _xpc_base_create (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4F1C32: _xpc_domain_create (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EFF1E: _libxpc_initializer (in /usr/lib/system/libxpc.dylib)
==90966== by 0x1CFE7D: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==90966== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC034B7: dyld::initializeMainExecutable() (in /usr/lib/dyld)
==90966==
==90966== 224 bytes in 7 blocks are still reachable in loss record 5 of 9
==90966== at 0x5237: malloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==90966== by 0x4E793D: _xpc_malloc (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EDCB4: _xpc_dictionary_insert (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EDE0E: xpc_dictionary_set_string (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EFE8C: _libxpc_initializer (in /usr/lib/system/libxpc.dylib)
==90966== by 0x1CFE7D: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==90966== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC034B7: dyld::initializeMainExecutable() (in /usr/lib/dyld)
==90966==
==90966== 520 bytes in 7 blocks are still reachable in loss record 6 of 9
==90966== at 0x5237: malloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==90966== by 0x342358: strdup (in /usr/lib/system/libsystem_c.dylib)
==90966== by 0x4E7802: _xpc_strdup (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EEBF5: xpc_string_create (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EDDFD: xpc_dictionary_set_string (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EFE8C: _libxpc_initializer (in /usr/lib/system/libxpc.dylib)
==90966== by 0x1CFE7D: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==90966== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966==
==90966== 608 bytes in 1 blocks are still reachable in loss record 7 of 9
==90966== at 0x58DE: calloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==90966== by 0x4E78FA: _xpc_calloc (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4E81D4: _xpc_base_create (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EDFDA: xpc_dictionary_create (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EFE63: _libxpc_initializer (in /usr/lib/system/libxpc.dylib)
==90966== by 0x1CFE7D: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==90966== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC034B7: dyld::initializeMainExecutable() (in /usr/lib/dyld)
==90966==
==90966== 616 bytes in 7 blocks are still reachable in loss record 8 of 9
==90966== at 0x58DE: calloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==90966== by 0x4E78FA: _xpc_calloc (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4E81D4: _xpc_base_create (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EEBEA: xpc_string_create (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EDDFD: xpc_dictionary_set_string (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EFE8C: _libxpc_initializer (in /usr/lib/system/libxpc.dylib)
==90966== by 0x1CFE7D: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==90966== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966==
==90966== 4,096 bytes in 1 blocks are still reachable in loss record 9 of 9
==90966== at 0x5237: malloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==90966== by 0x34F3F7: __smakebuf (in /usr/lib/system/libsystem_c.dylib)
==90966== by 0x345D19: __swsetup (in /usr/lib/system/libsystem_c.dylib)
==90966== by 0x3466C3: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==90966== by 0x34618D: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==90966== by 0x34F2CF: printf (in /usr/lib/system/libsystem_c.dylib)
==90966== by 0x1000014D0: main (in .//diskimageaccess)
==90966==
==90966== LEAK SUMMARY:
==90966== definitely lost: 0 bytes in 0 blocks
==90966== indirectly lost: 0 bytes in 0 blocks
==90966== possibly lost: 0 bytes in 0 blocks
==90966== still reachable: 6,383 bytes in 33 blocks
==90966== suppressed: 0 bytes in 0 blocks
==90966==
==90966== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
==90966== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
EDIT:
I tried moving the code over to a Linux machine and it compiles and runs perfectly cleanly without any memory errors. Any ideas why this is?
Well, someone must be using these functions if valgrind tells you that. If you’re sure that you are not using any heap-functions then some of your dependencies is using
malloc/calloc. Which libraries do you use?