2
0

memdebug.h 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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-2022, 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. #ifdef USE_VALGRIND
  20. #include <valgrind/memcheck.h>
  21. #else
  22. #define VALGRIND_CHECK_MEM_IS_DEFINED(addr, size) do {} while (0)
  23. #define VALGRIND_CREATE_MEMPOOL(context, redzones, zeroed) do {} while (0)
  24. #define VALGRIND_DESTROY_MEMPOOL(context) do {} while (0)
  25. #define VALGRIND_MAKE_MEM_DEFINED(addr, size) do {} while (0)
  26. #define VALGRIND_MAKE_MEM_NOACCESS(addr, size) do {} while (0)
  27. #define VALGRIND_MAKE_MEM_UNDEFINED(addr, size) do {} while (0)
  28. #define VALGRIND_MEMPOOL_ALLOC(context, addr, size) do {} while (0)
  29. #define VALGRIND_MEMPOOL_FREE(context, addr) do {} while (0)
  30. #define VALGRIND_MEMPOOL_CHANGE(context, optr, nptr, size) do {} while (0)
  31. #endif
  32. #ifdef CLOBBER_FREED_MEMORY
  33. /* Wipe freed memory for debugging purposes */
  34. static inline void
  35. wipe_mem(void *ptr, size_t size)
  36. {
  37. VALGRIND_MAKE_MEM_UNDEFINED(ptr, size);
  38. memset(ptr, 0x7F, size);
  39. VALGRIND_MAKE_MEM_NOACCESS(ptr, size);
  40. }
  41. #endif /* CLOBBER_FREED_MEMORY */
  42. #ifdef MEMORY_CONTEXT_CHECKING
  43. static inline void
  44. set_sentinel(void *base, Size offset)
  45. {
  46. char *ptr = (char *) base + offset;
  47. VALGRIND_MAKE_MEM_UNDEFINED(ptr, 1);
  48. *ptr = 0x7E;
  49. VALGRIND_MAKE_MEM_NOACCESS(ptr, 1);
  50. }
  51. static inline bool
  52. sentinel_ok(const void *base, Size offset)
  53. {
  54. const char *ptr = (const char *) base + offset;
  55. bool ret;
  56. VALGRIND_MAKE_MEM_DEFINED(ptr, 1);
  57. ret = *ptr == 0x7E;
  58. VALGRIND_MAKE_MEM_NOACCESS(ptr, 1);
  59. return ret;
  60. }
  61. #endif /* MEMORY_CONTEXT_CHECKING */
  62. #ifdef RANDOMIZE_ALLOCATED_MEMORY
  63. void randomize_mem(char *ptr, size_t size);
  64. #endif /* RANDOMIZE_ALLOCATED_MEMORY */
  65. #endif /* MEMDEBUG_H */