diff options
author | Ratakor <ratakor@disroot.org> | 2023-07-05 11:52:21 +0200 |
---|---|---|
committer | Ratakor <ratakor@disroot.org> | 2023-07-05 11:52:21 +0200 |
commit | 3984c2e6fdea72a5f04ec7c57e4c59dbaf6638ca (patch) | |
tree | 9ee7f0ae6ae13fe1e1fb9ed5e1bf6fce1b3171ca | |
parent | 0c4aa58638d7adfb98f5b112cc311d872e5419ff (diff) |
Change NO_DALLOC macro position + bug fix + rename
Change NO_DALLOC macro position to not allocate memory for
magic_numbers, pointers, etc when dalloc is not used.
Fix dalloc_check_free() that would output the wrong amount of pointers
not freed.
Name change because ___ is ugly and _dalloc_ is less prone to be already
used.
-rw-r--r-- | dalloc.c | 123 | ||||
-rw-r--r-- | dalloc.h | 43 |
2 files changed, 86 insertions, 80 deletions
@@ -20,18 +20,15 @@ #include <stdlib.h> #include <string.h> -#ifndef DALLOC -#define NO_DALLOC "dalloc: Define `DALLOC` to enable dalloc" -#else -void dalloc_check_all(void) __attribute__((destructor)); +#define EXIT_STATUS 9 + +#ifdef DALLOC #undef DALLOC -#endif /* DALLOC */ #include "dalloc.h" #define MIN(X, Y) ((X) < (Y) ? (X) : (Y)) #define OVER_ALLOC 64 #define MAGIC_NUMBER 0x99 -#define EXIT_STATUS 9 #define MAX_POINTERS 512 #define COMMENT_MAX 128 @@ -46,6 +43,7 @@ struct Pointer { static int overflow(void *p, size_t siz); static size_t find_pointer_index(void *p, char *file, int line); +extern void dalloc_check_all(void) __attribute__((destructor)); static pthread_mutex_t dalloc_mutex = PTHREAD_MUTEX_INITIALIZER; static char magic_numbers[OVER_ALLOC]; @@ -83,11 +81,6 @@ dalloc_check_overflow(void) { size_t i, sum = 0; -#ifdef NO_DALLOC - fprintf(stderr, "%s\n", NO_DALLOC); - return 0; -#endif /* NO_DALLOC */ - pthread_mutex_lock(&dalloc_mutex); fprintf(stderr, "Memory overflow:"); for (i = 0; i < npointers; i++) { @@ -114,12 +107,7 @@ dalloc_check_overflow(void) void dalloc_check_free(void) { - size_t i, sum = 0; - -#ifdef NO_DALLOC - fprintf(stderr, "%s\n", NO_DALLOC); - return; -#endif /* NO_DALLOC */ + size_t i, n = 0, sum = 0; pthread_mutex_lock(&dalloc_mutex); fprintf(stderr, "Memory allocated and not freed:"); @@ -127,6 +115,7 @@ dalloc_check_free(void) if (pointers[i].ignored) continue; + n++; sum += pointers[i].siz; fprintf(stderr, "\n%s:%d: %p, %zu bytes", pointers[i].file, pointers[i].line, @@ -139,42 +128,21 @@ dalloc_check_free(void) if (sum == 0) fprintf(stderr, " 0 byte :)\n"); else - fprintf(stderr, "\nTotal: %zu bytes, %zu pointers\n", sum, i); + fprintf(stderr, "\nTotal: %zu bytes, %zu pointers\n", sum, n); } void dalloc_check_all(void) { -#ifdef NO_DALLOC - fprintf(stderr, "%s\n", NO_DALLOC); - return; -#endif /* NO_DALLOC */ - dalloc_check_overflow(); dalloc_check_free(); } void -dalloc_sighandler(int sig) -{ -#ifdef _WIN32 - fprintf(stderr, "dalloc: signal %d\n", sig); -#else - fprintf(stderr, "dalloc: %s\n", strsignal(sig)); -#endif /* _WIN32 */ - - exit(EXIT_STATUS); -} - -void -___dalloc_ignore(void *p, char *file, int line) +_dalloc_ignore(void *p, char *file, int line) { size_t i; -#ifdef NO_DALLOC - return; -#endif /* NO_DALLOC */ - pthread_mutex_lock(&dalloc_mutex); i = find_pointer_index(p, file, line); pointers[i].ignored = 1; @@ -182,14 +150,10 @@ ___dalloc_ignore(void *p, char *file, int line) } void -___dalloc_comment(void *p, const char *comment, char *file, int line) +_dalloc_comment(void *p, const char *comment, char *file, int line) { size_t i, siz; -#ifdef NO_DALLOC - return; -#endif /* NO_DALLOC */ - if (comment == NULL) return; @@ -202,7 +166,7 @@ ___dalloc_comment(void *p, const char *comment, char *file, int line) } void -___free(void *p, char *file, int line) +_dalloc_free(void *p, char *file, int line) { size_t i; @@ -231,9 +195,8 @@ ___free(void *p, char *file, int line) pthread_mutex_unlock(&dalloc_mutex); } - void * -___malloc(size_t siz, char *file, int line) +_dalloc_malloc(size_t siz, char *file, int line) { void *p = NULL; size_t sizfname; @@ -273,7 +236,7 @@ ___malloc(size_t siz, char *file, int line) } void * -___calloc(size_t nmemb, size_t siz, char *file, int line) +_dalloc_calloc(size_t nmemb, size_t siz, char *file, int line) { void *p; @@ -287,22 +250,22 @@ ___calloc(size_t nmemb, size_t siz, char *file, int line) } siz *= nmemb; - p = ___malloc(siz, file, line); + p = _dalloc_malloc(siz, file, line); memset(p, 0, siz); return p; } void * -___realloc(void *p, size_t siz, char *file, int line) +_dalloc_realloc(void *p, size_t siz, char *file, int line) { size_t i, sizfname; if (p == NULL) - return ___malloc(siz, file, line); + return _dalloc_malloc(siz, file, line); if (siz == 0) { - ___free(p, file, line); + _dalloc_free(p, file, line); return NULL; } @@ -349,32 +312,32 @@ ___realloc(void *p, size_t siz, char *file, int line) } void * -___reallocarray(void *p, size_t nmemb, size_t siz, char *file, int line) +_dalloc_reallocarray(void *p, size_t n, size_t s, char *file, int line) { - if (siz != 0 && nmemb > -1 / siz) { + if (s != 0 && n > -1 / s) { fprintf(stderr, "%s:%d: dalloc: reallocarray: %s\n", file, line, strerror(ENOMEM)); exit(EXIT_STATUS); } - return ___realloc(p, nmemb * siz, file, line); + return _dalloc_realloc(p, n * s, file, line); } char * -___strdup(const char *s, char *file, int line) +_dalloc_strdup(const char *s, char *file, int line) { char *p; size_t siz; siz = strlen(s) + 1; - p = ___malloc(siz, file, line); + p = _dalloc_malloc(siz, file, line); memcpy(p, s, siz); return p; } char * -___strndup(const char *s, size_t n, char *file, int line) +_dalloc_strndup(const char *s, size_t n, char *file, int line) { const char *end; char *p; @@ -382,13 +345,53 @@ ___strndup(const char *s, size_t n, char *file, int line) end = memchr(s, '\0', n); siz = (end ? (size_t)(end - s) : n) + 1; - p = ___malloc(siz, file, line); + p = _dalloc_malloc(siz, file, line); memcpy(p, s, siz - 1); p[siz - 1] = '\0'; return p; } +#else + +#include "dalloc.h" + +#define NO_DALLOC "dalloc: Define `DALLOC` to enable dalloc" + +size_t +dalloc_check_overflow(void) +{ + fprintf(stderr, "%s\n", NO_DALLOC); + return 0; +} + +void +dalloc_check_free(void) +{ + fprintf(stderr, "%s\n", NO_DALLOC); + return; +} + +void +dalloc_check_all(void) +{ + fprintf(stderr, "%s\n", NO_DALLOC); + return; +} +#endif /* DALLOC */ + +void +dalloc_sighandler(int sig) +{ +#ifdef _WIN32 + fprintf(stderr, "dalloc: signal %d\n", sig); +#else + fprintf(stderr, "dalloc: %s\n", strsignal(sig)); +#endif /* _WIN32 */ + + exit(EXIT_STATUS); +} + void exitsegv(int dummy) { @@ -16,36 +16,39 @@ extern "C" { #endif /* __cplusplus */ #ifdef DALLOC -#define free(p) (___free(p, __FILE__, __LINE__)) -#define malloc(siz) (___malloc(siz, __FILE__, __LINE__)) -#define calloc(nmemb, siz) (___calloc(nmemb, siz, __FILE__, __LINE__)) -#define realloc(p, siz) (___realloc(p, siz, __FILE__, __LINE__)) -#define reallocarray(p, n, s) (___reallocarray(p, n, s, __FILE__, __LINE__)) -#define strdup(s) (___strdup(s, __FILE__, __LINE__)) -#define strndup(s, n) (___strndup(s, n, __FILE__, __LINE__)) +#define free(p) (_dalloc_free(p, __FILE__, __LINE__)) +#define malloc(siz) (_dalloc_malloc(siz, __FILE__, __LINE__)) +#define calloc(nmemb, siz) (_dalloc_calloc(nmemb, siz, __FILE__, __LINE__)) +#define realloc(p, siz) (_dalloc_realloc(p, siz, __FILE__, __LINE__)) +#define reallocarray(p, n, s) (_dalloc_reallocarray(p, n, s, __FILE__, __LINE__)) +#define strdup(s) (_dalloc_strdup(s, __FILE__, __LINE__)) +#define strndup(s, n) (_dallloc_strndup(s, n, __FILE__, __LINE__)) + +#define dalloc_ignore(p) (_dalloc_ignore(p, __FILE__, __LINE__)) +#define dalloc_comment(p, com) (_dalloc_comment(p, com, __FILE__, __LINE__)) +#else +#define dalloc_ignore(p) +#define dalloc_comment(p, comment) #endif /* DALLOC */ #ifdef EXITSEGV -#define exit(dummy) (exitsegv(dummy)) +#define exit(dummy) (exitsegv(dummy)) #endif /* EXITSEGV */ -#define dalloc_ignore(p) (___dalloc_ignore(p, __FILE__, __LINE__)) -#define dalloc_comment(p, com) (___dalloc_comment(p, com, __FILE__, __LINE__)) - size_t dalloc_check_overflow(void); void dalloc_check_free(void); void dalloc_check_all(void); void dalloc_sighandler(int sig); -void ___dalloc_ignore(void *p, char *file, int line); -void ___dalloc_comment(void *p, const char *comment, char *file, int line); -void ___free(void *p, char *file, int line); -void *___malloc(size_t siz, char *file, int line); -void *___calloc(size_t nmemb, size_t siz, char *file, int line); -void *___realloc(void *p, size_t siz, char *file, int line); -void *___reallocarray(void *p, size_t nmemb, size_t siz, char *file, int line); -char *___strdup(const char *s, char *file, int line); -char *___strndup(const char *s, size_t n, char *file, int line); +void _dalloc_ignore(void *p, char *file, int line); +void _dalloc_comment(void *p, const char *comment, char *file, int line); +void _dalloc_free(void *p, char *file, int line); +void *_dalloc_malloc(size_t siz, char *file, int line); +void *_dalloc_calloc(size_t nmemb, size_t siz, char *file, int line); +void *_dalloc_realloc(void *p, size_t siz, char *file, int line); +void *_dalloc_reallocarray(void *p, size_t n, size_t s, char *file, int line); +char *_dalloc_strdup(const char *s, char *file, int line); +char *_dalloc_strndup(const char *s, size_t n, char *file, int line); void exitsegv(int dummy); |