revolutionize c or whatever

This commit is contained in:
cannoli-fruit 2026-08-02 07:34:05 -04:00
commit e0e6bad67e
4 changed files with 96 additions and 0 deletions

66
memsafe.h Normal file
View file

@ -0,0 +1,66 @@
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
// 14 LOC in i realized this is just shitty raii...
// Still finishing it we ball
#ifndef MEMSAFE_ONCE
#define MEMSAFE_ONCE
void safefree(void *x);
void *safemalloc(size_t x);
#endif
#ifdef MEMSAFE_PLEASE
typedef struct {
void **ptrs;
size_t cnt;
size_t cap;
} memsafe_allocation;
struct {
memsafe_allocation *allocs;
size_t cnt;
size_t cap;
} memsafe_allocstack = {0};
#define memsafe_pushhist do {\
if (memsafe_allocstack.cap == 0) { \
memsafe_allocstack.allocs = malloc(8*sizeof(memsafe_allocation)); \
memsafe_allocstack.cap = 8; \
memsafe_allocstack.cnt = 0; \
} \
if (memsafe_allocstack.cnt >= memsafe_allocstack.cap) { \
memsafe_allocstack.allocs = realloc(memsafe_allocstack.allocs, \
2*memsafe_allocstack.cap*sizeof(memsafe_allocation)); \
memsafe_allocstack.cap *= 2; \
} \
memsafe_allocstack.allocs[memsafe_allocstack.cnt++] = \
(memsafe_allocation) { \
.ptrs = malloc(64*sizeof(void*)), \
.cnt = 0, \
.cap = 64 \
}; \
} while(0)
#define memsafe_pophist do {\
memsafe_allocation a = memsafe_allocstack.allocs \
[--memsafe_allocstack.cnt]; \
for (int i = 0; i < a.cnt; ++i) { \
free(a.ptrs[i]); \
} \
free(a.ptrs); \
} while(0)
void safefree(void *x) {
assert(0 && "No manual freeing we do memory safety here");
}
void *safemalloc(size_t x) {
memsafe_allocation *a = &memsafe_allocstack.allocs[memsafe_allocstack.cnt-1];
if (a->cnt >= a->cap) {
a->ptrs = realloc(a->ptrs, 2*a->cap*sizeof(void*));
a->cap *= 2;
}
void *p = malloc(x);
a->ptrs[a->cnt++] = p;
return p;
}
#endif