diff --git a/Makefile b/Makefile index 2849938..6b283bb 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,28 @@ -CC := gcc -CFLAGS := -g -O3 -std=c2x -Wall -Wextra -Wpedantic -Werror -Iinclude +all: + +BUILD ?= debug +COMPILER ?= gcc + +# ==== set compiler flags ==== +# credits Maxim Egorushkin: +# https://stackoverflow.com/questions/48791883/best-practice-for-building-a-make-file/48793058#48793058 + +CC := $(COMPILER) + +# -fsanitize={address,undefined} +CFLAGS.gcc.debug := -Og -ggdb -pg -fsanitize=address -fno-omit-frame-pointer +CFLAGS.gcc.release := -O3 -g -march=native -DNDEBUG +CFLAGS.gcc := -fanalyzer + +CFLAGS.clang.debug :=-O0 -g3 -DBACKTRACE -rdynamic +CFLAGS.clang.release :=-O3 -g -march=native -DNDEBUG +CFLAGS.clang := + +CFLAGS := ${CFLAGS.${COMPILER}} ${CFLAGS.${COMPILER}.${BUILD}} \ + -Iinclude \ + -std=c2x \ + -Wall -Wextra -Wpedantic -Werror BUILD_DIR := build BIN_DIR := lib @@ -9,6 +31,8 @@ TEST_DIR := test OBJS := $(BUILD_DIR)/arena.o FPIC_OBJS := $(BUILD_DIR)/fpic/arena.o +all : static + static : $(BIN_DIR)/libarena.a dynamic : $(BIN_DIR)/libarena.so @@ -16,13 +40,13 @@ dynamic : $(BIN_DIR)/libarena.so tests : test/test_arena $(TEST_DIR)/test_arena : src/test_arena.c $(BIN_DIR)/libarena.a | $(TEST_DIR) - $(CC) -o $@ -O0 -Iinclude -ggdb $^ + $(CC) -o $@ $(CFLAGS) $^ $(BIN_DIR)/libarena.a : $(OBJS) | $(BIN_DIR) ar cr $@ $^ $(BIN_DIR)/libarena.so : $(FPIC_OBJS) | $(BIN_DIR) - $(CC) -shared -o $@ $^ + $(CC) -o $@ -shared $(CFLAGS) $^ $(BUILD_DIR)/%.o : src/%.c | $(BUILD_DIR) $(CC) -o $@ -c $(CFLAGS) $< diff --git a/src/arena.c b/src/arena.c index a72cbf4..5af820e 100644 --- a/src/arena.c +++ b/src/arena.c @@ -58,11 +58,13 @@ void _arena_new_page(arena_t* a, size_t size) return; } - a->head->next = calloc(1, sizeof *(a->head->next)); + void* tmp = calloc(1, sizeof *(a->head->next)); - if (a->head->next == NULL) + if (tmp == NULL) exit(errno); + a->head->next = tmp; + a->head = a->head->next; a->head->data = malloc(size); @@ -115,12 +117,14 @@ void* arena_calloc(arena_t* a, size_t nmemb, size_t size) void* arena_realloc_tail(arena_t* a, size_t len) { if (a->head->offset == BIG_PAGE) { - a->head->data = realloc(a->head->data, len); + void* tmp = realloc(a->head->data, len); - if (a->head->data == NULL) + if (tmp == NULL) exit(errno); - return a->head->data; + a->head->data = tmp; + + return tmp; } a->head->offset = a->head->prev_offset; diff --git a/src/test_arena.c b/src/test_arena.c index d44125e..55d34fe 100644 --- a/src/test_arena.c +++ b/src/test_arena.c @@ -17,10 +17,10 @@ int main() for (size_t i = 0; i < 1024; i++) { char* c = arena_alloc(&default_arena, sizeof *c); - *c = i & 0xFF; - if (c == NULL) err(EXIT_FAILURE, "failed to allocate memory"); + + *c = i & 0xFF; } printf("\n OK!\n"); @@ -36,5 +36,7 @@ int main() printf("\n OK!\n"); + arena_delete(&default_arena); + return 0; }