From d0bd16da2f913417de3b1bd797e9f498d6341f76 Mon Sep 17 00:00:00 2001 From: Guillem George Date: Tue, 4 Nov 2025 14:38:36 +0100 Subject: [PATCH] ' --- .gitignore | 3 +++ beware_overflow/beware_overflow.c | 11 +++++++++++ beware_overflow/beware_overflow.h | 8 ++++++++ beware_overflow/main.c | 21 +++++++++++++++++++++ my_recycler/my_recycler.c | 1 + my_recycler/my_recycler.h | 24 ++++++++++++++++++++++++ page_begin/main.c | 21 +++++++++++++++++++++ page_begin/page_begin.c | 0 page_begin/page_begin.h | 8 ++++++++ 9 files changed, 97 insertions(+) create mode 100644 .gitignore create mode 100644 beware_overflow/beware_overflow.c create mode 100644 beware_overflow/beware_overflow.h create mode 100644 beware_overflow/main.c create mode 100644 my_recycler/my_recycler.c create mode 100644 my_recycler/my_recycler.h create mode 100644 page_begin/main.c create mode 100644 page_begin/page_begin.c create mode 100644 page_begin/page_begin.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7d45161 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +a.out +*.o +*.a diff --git a/beware_overflow/beware_overflow.c b/beware_overflow/beware_overflow.c new file mode 100644 index 0000000..a97ef7e --- /dev/null +++ b/beware_overflow/beware_overflow.c @@ -0,0 +1,11 @@ +#include "beware_overflow.h" + +void *beware_overflow(void *ptr, size_t nmemb, size_t size) +{ + size_t c; + if (__builtin_mul_overflow(nmemb, size, &c)) + return NULL; + + char *byte_ptr = ptr; + return c + byte_ptr; +} diff --git a/beware_overflow/beware_overflow.h b/beware_overflow/beware_overflow.h new file mode 100644 index 0000000..821e81e --- /dev/null +++ b/beware_overflow/beware_overflow.h @@ -0,0 +1,8 @@ +#ifndef BEWARE_OVERFLOW_H +#define BEWARE_OVERFLOW_H + +#include + +void *beware_overflow(void *ptr, size_t nmemb, size_t size); + +#endif /* BEWARE_OVERFLOW_H */ diff --git a/beware_overflow/main.c b/beware_overflow/main.c new file mode 100644 index 0000000..42fd689 --- /dev/null +++ b/beware_overflow/main.c @@ -0,0 +1,21 @@ +#include +#include + +#include "beware_overflow.h" + +void print_overflow(void *ptr, size_t nmemb, size_t size) +{ + void *begin = ptr; + void *res = beware_overflow(ptr, nmemb, size); + if (res) + printf("Pointer was incremented from %p to %p.\n", begin, res); + else + printf("Overflow detected between %ld and %ld.\n", nmemb, size); +} + +int main(void) +{ + print_overflow((void *)0x1000, 25, 6); + print_overflow((void *)0x40000, 12345678904, 12345678904); + return 0; +} diff --git a/my_recycler/my_recycler.c b/my_recycler/my_recycler.c new file mode 100644 index 0000000..e84f090 --- /dev/null +++ b/my_recycler/my_recycler.c @@ -0,0 +1 @@ +#include "my_recycler.h" diff --git a/my_recycler/my_recycler.h b/my_recycler/my_recycler.h new file mode 100644 index 0000000..36418dd --- /dev/null +++ b/my_recycler/my_recycler.h @@ -0,0 +1,24 @@ +#ifndef MY_RECYCLER_H +#define MY_RECYCLER_H + +#include + +struct recycler +{ + size_t block_size; // size of a block + size_t capacity; // number of blocks in the chunk + void *chunk; // memory chunk containing all blocks + void *free; // address of the first free block of the free list +}; + +struct free_list +{ + struct free_list *next; // next free block +}; + +struct recycler *recycler_create(size_t block_size, size_t total_size); +void recycler_destroy(struct recycler *r); +void *recycler_allocate(struct recycler *r); +void recycler_free(struct recycler *r, void *block); + +#endif /* ! MY_RECYCLER_H */ diff --git a/page_begin/main.c b/page_begin/main.c new file mode 100644 index 0000000..8fc931e --- /dev/null +++ b/page_begin/main.c @@ -0,0 +1,21 @@ +#include + +#include "page_begin.h" + +static void display_result(void *ptr, size_t page_size, void *expected_result) +{ + void *res = page_begin(ptr, page_size); + + printf("ptr: %p\n", ptr); + printf("page_size: %lu\n", page_size); + printf("expected_result: %p\n", expected_result); + printf("result: %p\n", res); + + printf(expected_result == res ? "OK\n" : "KO\n"); +} + +int main(void) +{ + display_result((void *)0x1234ffea, 4096, (void *)0x1234f000); + display_result((void *)0x1234ffea, 256, (void *)0x1234ff00); +} diff --git a/page_begin/page_begin.c b/page_begin/page_begin.c new file mode 100644 index 0000000..e69de29 diff --git a/page_begin/page_begin.h b/page_begin/page_begin.h new file mode 100644 index 0000000..ba467d5 --- /dev/null +++ b/page_begin/page_begin.h @@ -0,0 +1,8 @@ +#ifndef PAGE_BEGIN_H +#define PAGE_BEGIN_H + +#include + +void *page_begin(void *ptr, size_t page_size); + +#endif /* !PAGE_BEGIN_H */