Ruby 4.1.0dev (2026-03-07 revision 55694ad7efc3f8dc6d5c7aefa60ded4c303ed6cf)
debug_allocator.h
Go to the documentation of this file.
1
6#ifndef PRISM_DEBUG_ALLOCATOR_H
7#define PRISM_DEBUG_ALLOCATOR_H
8
9#include <string.h>
10#include <stdio.h>
11#include <stdlib.h>
12
13static inline void *
14pm_debug_malloc(size_t size)
15{
16 size_t *memory = xmalloc(size + sizeof(size_t));
17 memory[0] = size;
18 return memory + 1;
19}
20
21static inline void *
22pm_debug_calloc(size_t nmemb, size_t size)
23{
24 size_t total_size = nmemb * size;
25 void *ptr = pm_debug_malloc(total_size);
26 memset(ptr, 0, total_size);
27 return ptr;
28}
29
30static inline void *
31pm_debug_realloc(void *ptr, size_t size)
32{
33 if (ptr == NULL) {
34 return pm_debug_malloc(size);
35 }
36
37 size_t *memory = (size_t *)ptr;
38 void *raw_memory = memory - 1;
39 memory = (size_t *)xrealloc(raw_memory, size + sizeof(size_t));
40 memory[0] = size;
41 return memory + 1;
42}
43
44static inline void
45pm_debug_free(void *ptr)
46{
47 if (ptr != NULL) {
48 size_t *memory = (size_t *)ptr;
49 xfree(memory - 1);
50 }
51}
52
53static inline void
54pm_debug_free_sized(void *ptr, size_t old_size)
55{
56 if (ptr != NULL) {
57 size_t *memory = (size_t *)ptr;
58 if (old_size != memory[-1]) {
59 fprintf(stderr, "[BUG] buffer %p was allocated with size %lu but freed with size %lu\n", ptr, memory[-1], old_size);
60 abort();
61 }
62 xfree_sized(memory - 1, old_size + sizeof(size_t));
63 }
64}
65
66static inline void *
67pm_debug_realloc_sized(void *ptr, size_t size, size_t old_size)
68{
69 if (ptr == NULL) {
70 if (old_size != 0) {
71 fprintf(stderr, "[BUG] realloc_sized called with NULL pointer and old size %lu\n", old_size);
72 abort();
73 }
74 return pm_debug_malloc(size);
75 }
76
77 size_t *memory = (size_t *)ptr;
78 if (old_size != memory[-1]) {
79 fprintf(stderr, "[BUG] buffer %p was allocated with size %lu but realloced with size %lu\n", ptr, memory[-1], old_size);
80 abort();
81 }
82 return pm_debug_realloc(ptr, size);
83}
84
85#undef xmalloc
86#undef xrealloc
87#undef xcalloc
88#undef xfree
89#undef xrealloc_sized
90#undef xfree_sized
91
92#define xmalloc pm_debug_malloc
93#define xrealloc pm_debug_realloc
94#define xcalloc pm_debug_calloc
95#define xfree pm_debug_free
96#define xrealloc_sized pm_debug_realloc_sized
97#define xfree_sized pm_debug_free_sized
98
99#endif
#define xfree
Old name of ruby_xfree.
Definition xmalloc.h:58
#define xrealloc
Old name of ruby_xrealloc.
Definition xmalloc.h:56
#define xmalloc
Old name of ruby_xmalloc.
Definition xmalloc.h:53