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-2019, 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 |
39 | wipe_mem(void *ptr, size_t size) |
40 | { |
41 | VALGRIND_MAKE_MEM_UNDEFINED(ptr, size); |
42 | memset(ptr, 0x7F, size); |
43 | VALGRIND_MAKE_MEM_NOACCESS(ptr, size); |
44 | } |
45 | |
46 | #endif /* CLOBBER_FREED_MEMORY */ |
47 | |
48 | #ifdef MEMORY_CONTEXT_CHECKING |
49 | |
50 | static inline void |
51 | set_sentinel(void *base, Size offset) |
52 | { |
53 | char *ptr = (char *) base + offset; |
54 | |
55 | VALGRIND_MAKE_MEM_UNDEFINED(ptr, 1); |
56 | *ptr = 0x7E; |
57 | VALGRIND_MAKE_MEM_NOACCESS(ptr, 1); |
58 | } |
59 | |
60 | static inline bool |
61 | sentinel_ok(const void *base, Size offset) |
62 | { |
63 | const char *ptr = (const char *) base + offset; |
64 | bool ret; |
65 | |
66 | VALGRIND_MAKE_MEM_DEFINED(ptr, 1); |
67 | ret = *ptr == 0x7E; |
68 | VALGRIND_MAKE_MEM_NOACCESS(ptr, 1); |
69 | |
70 | 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 */ |
83 | |