Age Owner Branch data TLA Line data Source code
1 : : /*-------------------------------------------------------------------------
2 : : *
3 : : * memdebug.h
4 : : * Memory debugging support.
5 : : *
6 : : * Currently, this file either wraps <valgrind/memcheck.h> or substitutes
7 : : * empty definitions for Valgrind client request macros we use.
8 : : *
9 : : *
10 : : * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
11 : : * Portions Copyright (c) 1994, Regents of the University of California
12 : : *
13 : : * src/include/utils/memdebug.h
14 : : *
15 : : *-------------------------------------------------------------------------
16 : : */
17 : : #ifndef MEMDEBUG_H
18 : : #define MEMDEBUG_H
19 : :
20 : : #ifdef USE_VALGRIND
21 : : #include <valgrind/memcheck.h>
22 : : #else
23 : : #define VALGRIND_CHECK_MEM_IS_DEFINED(addr, size) do {} while (0)
24 : : #define VALGRIND_CREATE_MEMPOOL(context, redzones, zeroed) do {} while (0)
25 : : #define VALGRIND_DESTROY_MEMPOOL(context) do {} while (0)
26 : : #define VALGRIND_MAKE_MEM_DEFINED(addr, size) do {} while (0)
27 : : #define VALGRIND_MAKE_MEM_NOACCESS(addr, size) do {} while (0)
28 : : #define VALGRIND_MAKE_MEM_UNDEFINED(addr, size) do {} while (0)
29 : : #define VALGRIND_MEMPOOL_ALLOC(context, addr, size) do {} while (0)
30 : : #define VALGRIND_MEMPOOL_FREE(context, addr) do {} while (0)
31 : : #define VALGRIND_MEMPOOL_CHANGE(context, optr, nptr, size) do {} while (0)
32 : : #endif
33 : :
34 : :
35 : : #ifdef CLOBBER_FREED_MEMORY
36 : :
37 : : /* Wipe freed memory for debugging purposes */
38 : : static inline void
2603 andres@anarazel.de 39 :CBC 229566091 : wipe_mem(void *ptr, size_t size)
40 : : {
41 : : VALGRIND_MAKE_MEM_UNDEFINED(ptr, size);
42 : 229566091 : memset(ptr, 0x7F, size);
43 : : VALGRIND_MAKE_MEM_NOACCESS(ptr, size);
44 : 229566091 : }
45 : :
46 : : #endif /* CLOBBER_FREED_MEMORY */
47 : :
48 : : #ifdef MEMORY_CONTEXT_CHECKING
49 : :
50 : : static inline void
51 : 314405590 : set_sentinel(void *base, Size offset)
52 : : {
53 : 314405590 : char *ptr = (char *) base + offset;
54 : :
55 : : VALGRIND_MAKE_MEM_UNDEFINED(ptr, 1);
56 : 314405590 : *ptr = 0x7E;
57 : : VALGRIND_MAKE_MEM_NOACCESS(ptr, 1);
58 : 314405590 : }
59 : :
60 : : static inline bool
61 : 1605890998 : sentinel_ok(const void *base, Size offset)
62 : : {
63 : 1605890998 : const char *ptr = (const char *) base + offset;
64 : : bool ret;
65 : :
66 : : VALGRIND_MAKE_MEM_DEFINED(ptr, 1);
67 : 1605890998 : ret = *ptr == 0x7E;
68 : : VALGRIND_MAKE_MEM_NOACCESS(ptr, 1);
69 : :
70 : 1605890998 : return ret;
71 : : }
72 : :
73 : : #endif /* MEMORY_CONTEXT_CHECKING */
74 : :
75 : : #ifdef RANDOMIZE_ALLOCATED_MEMORY
76 : :
77 : : void randomize_mem(char *ptr, size_t size);
78 : :
79 : : #endif /* RANDOMIZE_ALLOCATED_MEMORY */
80 : :
81 : :
82 : : #endif /* MEMDEBUG_H */
|