|
|
|
|
@ -18,6 +18,9 @@
|
|
|
|
|
#define PREV_OFFSET LOCATION_MAX |
|
|
|
|
#define NEXT_OFFSET (LOCATION_MAX + POINTER_SIZE) |
|
|
|
|
|
|
|
|
|
// Порог детекта аномально больших аллокаций (гигантские mmap-резервации, напр. VSZ ~4G)
|
|
|
|
|
#define LARGE_ALLOC_LOG_THRESHOLD (8u * 1024u * 1024u) // 8 МБ
|
|
|
|
|
|
|
|
|
|
#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) |
|
|
|
|
#include <execinfo.h> |
|
|
|
|
#include <pthread.h> |
|
|
|
|
@ -121,6 +124,10 @@ void u_check(void* ptr, const char* text, const char* location) {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void* u_malloc_impl(uint32_t size, const char* location) { |
|
|
|
|
if (size >= LARGE_ALLOC_LOG_THRESHOLD) { |
|
|
|
|
DEBUG_WARN(DEBUG_CATEGORY_SYS, "LARGE ALLOC: %u bytes (%.1f MB) at %s", |
|
|
|
|
size, (double)size / (1024.0 * 1024.0), location); |
|
|
|
|
} |
|
|
|
|
uint32_t total = size + 12 + 2 * BOUNDARY_CHECK_SIZE + METADATA_SIZE; |
|
|
|
|
uint8_t* base = (uint8_t*)malloc(total); |
|
|
|
|
if (!base && size > 0) return NULL; |
|
|
|
|
@ -151,6 +158,10 @@ void* u_malloc_impl(uint32_t size, const char* location) {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void* u_calloc_impl(uint32_t nmemb, uint32_t size, const char* location) { |
|
|
|
|
if (nmemb != 0 && size > UINT32_MAX / nmemb) { |
|
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_SYS, "CALLOC OVERFLOW: %u * %u (wraps uint32) at %s", nmemb, size, location); |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
uint32_t total_size = nmemb * size; |
|
|
|
|
void* ptr = u_malloc_impl(total_size, location); |
|
|
|
|
if (ptr) memset(ptr, 0, total_size); |
|
|
|
|
|