(root)/
glibc-2.38/
malloc/
tst-malloc-backtrace.c
       1  /* Verify that backtrace does not deadlock on itself on memory corruption.
       2     Copyright (C) 2015-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <signal.h>
      20  #include <stdlib.h>
      21  
      22  #include <support/support.h>
      23  #include <libc-diag.h>
      24  
      25  #define SIZE 4096
      26  
      27  /* Wrap free with a function to prevent gcc from optimizing it out.  */
      28  static void
      29  __attribute__((noinline))
      30  call_free (void *ptr)
      31  {
      32    free (ptr);
      33  #if __GNUC_PREREQ (12, 0)
      34    /* Ignore a valid warning about using a pointer made indeterminate
      35       by a prior call to free().  */
      36    DIAG_IGNORE_NEEDS_COMMENT (12, "-Wuse-after-free");
      37  #endif
      38    *(size_t *)(ptr - sizeof (size_t)) = 1;
      39  #if __GNUC_PREREQ (12, 0)
      40    DIAG_POP_NEEDS_COMMENT;
      41  #endif
      42  }
      43  
      44  int
      45  do_test (void)
      46  {
      47    void *ptr1 = malloc (SIZE);
      48    void *ptr2 = malloc (SIZE);
      49  
      50    /* Avoid unwanted output to TTY after an expected memory corruption.  */
      51    ignore_stderr();
      52  
      53    call_free (ptr1);
      54    ptr1 = malloc (SIZE);
      55  
      56    /* Not reached.  The return statement is to put ptr2 into use so that gcc
      57       doesn't optimize out that malloc call.  */
      58    return (ptr1 == ptr2);
      59  }
      60  
      61  #define EXPECTED_SIGNAL SIGABRT
      62  #include <support/test-driver.c>