# hmemory **Repository Path**: ledrego/hmemory ## Basic Information - **Project Name**: hmemory - **Description**: No description available - **Primary Language**: Unknown - **License**: WTFPL - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-27 - **Last Updated**: 2025-08-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # hmemory # hmemory is a memory error detector for c/c++ programs. 1. overview 2. configuration - compile-time options - run-time options 3. error reports 4. test cases 5. usage example - build hmemory - memory leak - memory corruption 6. contact 7. license ## 1. overview ## hmemory is a lightweight memory error detector for c/c++ programs, specifically designed for embedded systems. main use case may include embedded systems where valgrind - addrcheck, or memcheck support **is not** available. and has benefits of: * has a negligible effect run-time speed * does not require any source code change * operating system and architecture independent * easy to use can detect errors of: - double/invalid free - mismatched use of malloc versus free - writing before or end of malloc'd blocks - invalid realloc - overlapping src and dst pointers in memcpy - memory leaks ## 2. configuration ## 1. compile-time options 2. run-time options ### 2.1. compile-time options ### hmemory configuration parameters can be set using make flags, please check example section for demonstration. - HMEMORY_ENABLE_CALLSTACK default 0 enable/disable reporting call trace information on error, useful but depends on libbdf, libdl, and backtrace function from glibc. may be disabled for toolchains which does not support backtracing. - HMEMORY_REPORT_CALLSTACK default 0 dump callstack info (function call history) for error point. - HMEMORY_ASSERT_ON_ERROR default 1 terminate the process on any pthreads api misuse and/or lock order violation. - HMEMORY_CORRUPTION_CHECK_INTERVAL default 5000 memory corruption checking interval in miliseconds, use -1 to disable. - HMEMORY_SHOW_REACHABLE default 0 show reachable memory on exit ### 2.2. run-time options ### hmemory reads configuration parameters from environment via getenv function call. one can either set/change environment variables in source code of monitored project via setenv function call, or set them globally in running shell using export function. please check example section for demonstration. - hmemory_report_callstack default 0 dump callstack info (function call history) for error point. - hmemory_assert_on_error default 1 terminate the process on any pthreads api misuse and/or lock order violation. - hmemory_corruption_check_interval default 5000 memory corruption checking interval in miliseconds, use -1 to disable. - hmemory_show_reachable default 0 show reachable memory on exit ## 3. error reports ## ## 4. test cases ## ## 5. usage example ## 1. build hmemory 2. memory leak 3. memory corruption using hmemory is pretty simple, just clone libhmemory and build; - add -include hmemory.h -DHMEMORY_DEBUG=1 -g -O1 to target cflags - link with -lhmemory -lpthread -lrt if HMEMORY_ENABLE_CALLSTACK is 0 or - link with -lhmemory -lpthread -lrt -ldl -lbfd if HMEMORY_ENABLE_CALLSTACK is 1 ### 5.1. build hmemory ### compile libhmemory with callstack support # git clone git://github.com/anhanguera/libhmemory.git # cd libhmemory # HMEMORY_ENABLE_CALLSTACK=1 make compile libhmemory without callstack support # git clone git://github.com/anhanguera/libhmemory.git # cd libhmemory # HMEMORY_ENABLE_CALLSTACK=0 make ### 5.2. memory leak ### let below is the source code - with memory leak - to be monitored: 1 #include 2 #include 3 #include 4 5 int main (int argc, char *argv[]) 6 { 7 void *rc; 8 (void) argc; 9 (void) argv; 10 rc = malloc(1024); 11 if (rc == NULL) { 12 fprintf(stderr, "malloc failed\n"); 13 exit(-1); 14 } 15 rc = malloc(1024); 16 if (rc == NULL) { 17 fprintf(stderr, "malloc failed\n"); 18 exit(-1); 19 } 20 free(rc); 21 return 0; 22 } compile and run as usual: # gcc -o app main.c # ./app application will exit normal, nothing unusual excpet that we have a leaking memory which was allocated at line 10. now, enable monitoring with hmemory: # gcc -include src/hmemory.h -DHMEMORY_DEBUG=1 -g -O1 -o app-debug main.c -Lsrc -lhmemory -lpthread # LD_LIBRARY_PATH=src ./app-debug $ ./app-debug (hmemory:19437) memory information: (hmemory:19437) current: 1032 bytes (0.00 mb) (hmemory:19437) peak : 2064 bytes (0.00 mb) (hmemory:19437) total : 2064 bytes (0.00 mb) (hmemory:19437) leaks : 1 items (hmemory:19437) memory leaks: (hmemory:19437) - 1032 bytes at: main (main.c:10) Assertion failed: (0 && "memory leak"), function hmemory_fini, file hmemory.c, line 775. hmemory will report memory information and leaking points on exit. ### 5.3. memory corruption ### let below is the source code - with memory corruption/overflow - to be monitored: 1 #include 2 #include 3 #include 4 #include 5 6 int main (int argc, char *argv[]) 7 { 8 void *rc; 9 (void) argc; 10 (void) argv; 11 rc = malloc(1024); 12 if (rc == NULL) { 13 fprintf(stderr, "malloc failed\n"); 14 exit(-1); 15 } 16 memset(rc, 0, 1025); 17 sleep(1); 18 free(rc); 19 return 0; 20 } enable monitoring with hmemory: # gcc -include src/hmemory.h -DHMEMORY_DEBUG=1 -g -O1 -o app-debug main.c -lhmemory -lpthread # ./app-debug (hmemory:19513) free with corrupted address (0x7fb5ab000000), overflow (hmemory:19513) at: main (main.c:18) Assertion failed: (((rcu == 0) && (rco == 0)) && "memory corruption"), function debug_memory_check_actual, file hmemory.c, line 634. free call after memset catchs the error. hmemory has check points in every intercepted call. there is also a corruption checker which works with defined interval, below is the example of how to tune: # gcc -include src/hmemory.h -DHMEMORY_DEBUG=1 -g -O1 -o app-debug main.c -lhmemory -lpthread # hmemory_corruption_check_interval=250 ./app-debug (hmemory:19530) worker check with corrupted address (0x7f80fb800000), overflow (hmemory:19530) at: hmemory_worker (hmemory.c:727) Assertion failed: (((rcu == 0) && (rco == 0)) && "memory corruption"), function debug_memory_check_actual, file hmemory.c, line 634. since the interval is 250 miliseconds, corruption checker could catch before hmemory check-points. ## 6. contact ## if you are using the software and/or have any questions, suggestions, etc. please contact with me at alper.akcan@gmail.com ## 7. license ## Copyright (C) 2008-2013 Alper Akcan This work is free. It comes without any warranty, to the extent permitted by applicable law. You can redistribute it and/or modify it under the terms of the Do What The Fuck You Want To Public License, Version 2, as published by Sam Hocevar. See the COPYING file for more details.