|
|
|
|
@ -194,7 +194,7 @@ void u_free_impl(void* ptr, const char* location) {
|
|
|
|
|
} |
|
|
|
|
UNLOCK(); |
|
|
|
|
if (!found) { |
|
|
|
|
printf("%s: u_free: Attempt to free unallocated or already freed pointer %p\n", location, ptr); |
|
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_MEMORY, "%s: u_free: Attempt to free unallocated or already freed pointer %p\n", location, ptr); |
|
|
|
|
exit(EXIT_FAILURE); |
|
|
|
|
} |
|
|
|
|
free(base); |
|
|
|
|
@ -214,10 +214,10 @@ void u_report_unfreed_blocks(void) {
|
|
|
|
|
void* head = allocated_head; |
|
|
|
|
UNLOCK(); |
|
|
|
|
if (count == 0) { |
|
|
|
|
printf("No unfreed memory blocks.\n"); |
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_MEMORY, "No unfreed memory blocks.\n"); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
printf("Unfreed memory blocks: %zu\n", count); |
|
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_MEMORY, "Unfreed memory blocks: %zu\n", count); |
|
|
|
|
void* curr = head; |
|
|
|
|
while (curr) { |
|
|
|
|
char* alloc_loc = (char*)curr; |
|
|
|
|
@ -225,8 +225,8 @@ void u_report_unfreed_blocks(void) {
|
|
|
|
|
uint32_t size = *(uint32_t*)(prefix_start + BOUNDARY_CHECK_SIZE + 4); |
|
|
|
|
void* user_ptr = prefix_start + BOUNDARY_CHECK_SIZE + 8; |
|
|
|
|
u_check(user_ptr, "unfreed_check", "u_report_unfreed_blocks"); |
|
|
|
|
printf(" - Allocated at: %s, size: %u bytes\n", alloc_loc, size); |
|
|
|
|
printf(" Full memory dump at %p:\n", user_ptr); |
|
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_MEMORY, " - Allocated at: %s, size: %u bytes\n", alloc_loc, size); |
|
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_MEMORY, " Full memory dump at %p:\n", user_ptr); |
|
|
|
|
hex_dump(user_ptr, size); |
|
|
|
|
curr = *(void**)((uint8_t*)curr + NEXT_OFFSET); |
|
|
|
|
} |
|
|
|
|
|