From bb00aff0b7101c08e896b0c777a6d36416891b92 Mon Sep 17 00:00:00 2001 From: kdx Date: Tue, 21 Feb 2023 00:01:26 +0100 Subject: initial commit --- README | 1 + build.sh | 2 ++ main.c | 31 +++++++++++++++++++++++++++++++ noleak.c | 34 ++++++++++++++++++++++++++++++++++ noleak.h | 6 ++++++ 5 files changed, 74 insertions(+) create mode 100644 README create mode 100755 build.sh create mode 100644 main.c create mode 100644 noleak.c create mode 100644 noleak.h diff --git a/README b/README new file mode 100644 index 0000000..2ce1041 --- /dev/null +++ b/README @@ -0,0 +1 @@ +jokingly avoiding leaks diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..bc27b95 --- /dev/null +++ b/build.sh @@ -0,0 +1,2 @@ +#!/bin/sh +gcc -g -Wall -Wextra -std=c99 -o noleak noleak.c main.c diff --git a/main.c b/main.c new file mode 100644 index 0000000..34d3348 --- /dev/null +++ b/main.c @@ -0,0 +1,31 @@ +#include "noleak.h" +#include +#include +#include + +void *alloc(size_t size) +{ + return noleak_alloc(size); +} + +int main(void) +{ + /* initialize noleak */ + if (noleak_init(1024 * 1024)) { + perror("noleak_init"); + return 1; + } + if (atexit(noleak_deinit)) { + perror("noleak_deinit"); + noleak_deinit(); + return 1; + } + + /* yolo */ + for (int i = 0; i < 512; i++) { + const size_t size = rand() % 1024; + char *const allocated = noleak_alloc(size); + memset(allocated, 'A', size); + } + return 0; +} diff --git a/noleak.c b/noleak.c new file mode 100644 index 0000000..eb676ca --- /dev/null +++ b/noleak.c @@ -0,0 +1,34 @@ +#include "noleak.h" +#include + +static void *___noleak_data = NULL; +static size_t ___noleak_capacity = 0; +static size_t ___noleak_used = 0; + +int noleak_init(size_t capacity) +{ + ___noleak_data = calloc(1, capacity); + if (___noleak_data == NULL) + return 1; + ___noleak_capacity = capacity; + return 0; +} + +void noleak_deinit(void) +{ + if (___noleak_data != NULL) { + free(___noleak_data); + ___noleak_data = NULL; + } +} + +void *noleak_alloc(size_t size) +{ + if (___noleak_data == NULL) + return NULL; + if (___noleak_used + size >= ___noleak_capacity) + return NULL; + void *const ptr = ___noleak_data + ___noleak_used; + ___noleak_used += size; + return ptr; +} diff --git a/noleak.h b/noleak.h new file mode 100644 index 0000000..e01c643 --- /dev/null +++ b/noleak.h @@ -0,0 +1,6 @@ +#pragma once +#include + +int noleak_init(size_t capacity); +void noleak_deinit(void); +void *noleak_alloc(size_t size); -- cgit v1.2.3