commit e0e6bad67e41feba0faa9aa2bfa19ed44099b8dc Author: cannoli-fruit Date: Sun Aug 2 07:34:05 2026 -0400 revolutionize c or whatever diff --git a/README.md b/README.md new file mode 100644 index 0000000..4795e2a --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# Memory safe C +don't use this diff --git a/examples/a.out b/examples/a.out new file mode 100755 index 0000000..abfbea7 Binary files /dev/null and b/examples/a.out differ diff --git a/examples/ll.c b/examples/ll.c new file mode 100644 index 0000000..617ea0e --- /dev/null +++ b/examples/ll.c @@ -0,0 +1,28 @@ +#include +#include +#define MEMSAFE_PLEASE +#include "memsafe.h" + +typedef struct LLNode { + int dat; + struct LLNode *next; +} LLNode; + +int main(void) { +memsafe_pushhist; + LLNode *root = safemalloc(sizeof(LLNode)); + root->dat = 0; + + LLNode *curr = root; + + for (int i = 1; i < 1000; ++i) { + LLNode *next = safemalloc(sizeof(LLNode)); + curr->next = next; + next->dat = i; + curr = next; + } + + root = NULL; +memsafe_pophist; + return 0; +} \ No newline at end of file diff --git a/memsafe.h b/memsafe.h new file mode 100644 index 0000000..706aacb --- /dev/null +++ b/memsafe.h @@ -0,0 +1,66 @@ +#include +#include +#include +// 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