aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README1
-rwxr-xr-xbuild.sh2
-rw-r--r--main.c31
-rw-r--r--noleak.c34
-rw-r--r--noleak.h6
5 files changed, 74 insertions, 0 deletions
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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+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 <stdlib.h>
+
+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 <stddef.h>
+
+int noleak_init(size_t capacity);
+void noleak_deinit(void);
+void *noleak_alloc(size_t size);