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 */
38static inline void
39wipe_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
50static inline void
51set_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
60static inline bool
61sentinel_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
77void randomize_mem(char *ptr, size_t size);
78
79#endif /* RANDOMIZE_ALLOCATED_MEMORY */
80
81
82#endif /* MEMDEBUG_H */
83