aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRatakor <ratakor@disroot.org>2023-07-05 11:52:21 +0200
committerRatakor <ratakor@disroot.org>2023-07-05 11:52:21 +0200
commit3984c2e6fdea72a5f04ec7c57e4c59dbaf6638ca (patch)
tree9ee7f0ae6ae13fe1e1fb9ed5e1bf6fce1b3171ca
parent0c4aa58638d7adfb98f5b112cc311d872e5419ff (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.c123
-rw-r--r--dalloc.h43
2 files changed, 86 insertions, 80 deletions
diff --git a/dalloc.c b/dalloc.c
index e65a7c4..cf9f37b 100644
--- a/dalloc.c
+++ b/dalloc.c
@@ -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)
{
diff --git a/dalloc.h b/dalloc.h
index b1f5b90..7d8376a 100644
--- a/dalloc.h
+++ b/dalloc.h
@@ -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);