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