LCOV - code coverage report
Current view: top level - src/include/utils - memdebug.h (source / functions) Coverage Total Hit
Test: Code coverage Lines: 100.0 % 19 19
Test Date: 2026-01-26 10:56:24 Functions: 100.0 % 3 3
Legend: Lines:     hit not hit

            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-2026, 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              : #define VALGRIND_MEMPOOL_TRIM(context, addr, size)                      do {} while (0)
      33              : #endif
      34              : 
      35              : 
      36              : #ifdef CLOBBER_FREED_MEMORY
      37              : 
      38              : /* Wipe freed memory for debugging purposes */
      39              : static inline void
      40     59425877 : wipe_mem(void *ptr, size_t size)
      41              : {
      42     59425877 :         VALGRIND_MAKE_MEM_UNDEFINED(ptr, size);
      43     59425877 :         memset(ptr, 0x7F, size);
      44     59425877 :         VALGRIND_MAKE_MEM_NOACCESS(ptr, size);
      45     59425877 : }
      46              : 
      47              : #endif                                                  /* CLOBBER_FREED_MEMORY */
      48              : 
      49              : #ifdef MEMORY_CONTEXT_CHECKING
      50              : 
      51              : static inline void
      52     71541095 : set_sentinel(void *base, Size offset)
      53              : {
      54     71541095 :         char       *ptr = (char *) base + offset;
      55              : 
      56     71541095 :         VALGRIND_MAKE_MEM_UNDEFINED(ptr, 1);
      57     71541095 :         *ptr = 0x7E;
      58     71541095 :         VALGRIND_MAKE_MEM_NOACCESS(ptr, 1);
      59     71541095 : }
      60              : 
      61              : static inline bool
      62    336452696 : sentinel_ok(const void *base, Size offset)
      63              : {
      64    336452696 :         const char *ptr = (const char *) base + offset;
      65    336452696 :         bool            ret;
      66              : 
      67    336452696 :         VALGRIND_MAKE_MEM_DEFINED(ptr, 1);
      68    336452696 :         ret = *ptr == 0x7E;
      69    336452696 :         VALGRIND_MAKE_MEM_NOACCESS(ptr, 1);
      70              : 
      71    672905392 :         return ret;
      72    336452696 : }
      73              : 
      74              : #endif                                                  /* MEMORY_CONTEXT_CHECKING */
      75              : 
      76              : #ifdef RANDOMIZE_ALLOCATED_MEMORY
      77              : 
      78              : void            randomize_mem(char *ptr, size_t size);
      79              : 
      80              : #endif                                                  /* RANDOMIZE_ALLOCATED_MEMORY */
      81              : 
      82              : 
      83              : #endif                                                  /* MEMDEBUG_H */
        

Generated by: LCOV version 2.3.2-1