(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
analyzer/
setjmp-7a.c
       1  /* { dg-additional-options "-fdiagnostics-show-line-numbers -fdiagnostics-path-format=inline-events -fdiagnostics-show-caret" } */
       2  /* { dg-enable-nn-line-numbers "" } */
       3  /* { dg-require-effective-target indirect_jumps } */
       4  
       5  #include "test-setjmp.h"
       6  #include <stdlib.h>
       7  
       8  extern int foo (int) __attribute__ ((__pure__));
       9  
      10  static jmp_buf env;
      11  
      12  static void inner (void)
      13  {
      14    longjmp (env, 1); /* { dg-warning "leak of 'ptr'" } */
      15  }
      16  
      17  static void middle (void)
      18  {
      19    void *ptr = malloc (1024);
      20    inner ();
      21    free (ptr);
      22  }
      23  
      24  void outer (void)
      25  {
      26    int i;
      27  
      28    foo (0);
      29  
      30    i = SETJMP(env);
      31  
      32    if (i == 0)
      33      {
      34        foo (1);
      35        middle ();
      36      }
      37  
      38    foo (3);
      39  }
      40  
      41  /* { dg-begin-multiline-output "" }
      42     NN |   longjmp (env, 1);
      43        |   ^~~~~~~~~~~~~~~~
      44    'outer': event 1
      45      |
      46      |   NN | void outer (void)
      47      |      |      ^~~~~
      48      |      |      |
      49      |      |      (1) entry to 'outer'
      50      |
      51    'outer': event 2
      52      |
      53      |   NN |   i = SETJMP(env);
      54      |      |       ^~~~~~
      55      |      |       |
      56      |      |       (2) 'setjmp' called here
      57      |
      58    'outer': events 3-5
      59      |
      60      |   NN |   if (i == 0)
      61      |      |      ^
      62      |      |      |
      63      |      |      (3) following 'true' branch (when 'i == 0')...
      64      |   NN |     {
      65      |   NN |       foo (1);
      66      |      |       ~~~~~~~
      67      |      |       |
      68      |      |       (4) ...to here
      69      |   NN |       middle ();
      70      |      |       ~~~~~~~~~
      71      |      |       |
      72      |      |       (5) calling 'middle' from 'outer'
      73      |
      74      +--> 'middle': events 6-8
      75             |
      76             |   NN | static void middle (void)
      77             |      |             ^~~~~~
      78             |      |             |
      79             |      |             (6) entry to 'middle'
      80             |   NN | {
      81             |   NN |   void *ptr = malloc (1024);
      82             |      |               ~~~~~~~~~~~~~
      83             |      |               |
      84             |      |               (7) allocated here
      85             |   NN |   inner ();
      86             |      |   ~~~~~~~~   
      87             |      |   |
      88             |      |   (8) calling 'inner' from 'middle'
      89             |
      90             +--> 'inner': events 9-11
      91                    |
      92                    |   NN | static void inner (void)
      93                    |      |             ^~~~~
      94                    |      |             |
      95                    |      |             (9) entry to 'inner'
      96                    |   NN | {
      97                    |   NN |   longjmp (env, 1);
      98                    |      |   ~~~~~~~~~~~~~~~~
      99                    |      |   |
     100                    |      |   (10) 'ptr' leaks here; was allocated at (7)
     101                    |      |   (11) rewinding from 'longjmp' in 'inner'...
     102                    |
     103      <-------------+
     104      |
     105    'outer': event 12
     106      |
     107      |   NN |   i = SETJMP(env);
     108      |      |       ^~~~~~
     109      |      |       |
     110      |      |       (12) ...to 'setjmp' in 'outer' (saved at (2))
     111      |
     112      { dg-end-multiline-output "" } */