mem: детект аномально больших аллокаций (LARGE ALLOC log + calloc overflow guard)
This commit is contained in:
1 parent
51a5c5bcbf
commit
1f1df4f437
1 file changed
+11
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user