1 /* Test backtrace and backtrace_symbols for recursive calls.
2    Copyright (C) 2010-2022 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 <execinfo.h>
20 #include <search.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 
25 #include "tst-backtrace.h"
26 
27 /* The backtrace should include at least 3 * fn, and do_test.  */
28 #define NUM_FUNCTIONS 4
29 
30 NO_INLINE int
fn(int c)31 fn (int c)
32 {
33   void *addresses[NUM_FUNCTIONS];
34   char **symbols;
35   int n;
36   int i;
37 
38   if (c > 0)
39     {
40       fn (c - 1);
41       return x;
42     }
43   /* Get the backtrace addresses.  */
44   n = backtrace (addresses, sizeof (addresses) / sizeof (addresses[0]));
45   printf ("Obtained backtrace with %d functions\n", n);
46   /*  Check that there are at least four functions.  */
47   if (n < NUM_FUNCTIONS)
48     {
49       FAIL ();
50       return 1;
51     }
52   /* Convert them to symbols.  */
53   symbols = backtrace_symbols (addresses, n);
54   /* Check that symbols were obtained.  */
55   if (symbols == NULL)
56     {
57       FAIL ();
58       return 1;
59     }
60   for (i = 0; i < n; ++i)
61     printf ("Function %d: %s\n", i, symbols[i]);
62   /* Check that the function names obtained are accurate.  */
63   for (i = 0; i < n - 1; ++i)
64     if (!match (symbols[i], "fn"))
65       {
66 	FAIL ();
67 	return 1;
68       }
69   /* Symbol names are not available for static functions, so we do not
70      check do_test.  */
71   return x;
72 }
73 
74 NO_INLINE int
do_test(void)75 do_test (void)
76 {
77   fn (2);
78   return ret;
79 }
80 
81 #include <support/test-driver.c>
82