1  /* { dg-additional-options "-fanalyzer-verbosity=1" } */
       2  
       3  #include <stdlib.h>
       4  
       5  void
       6  calls_free (void *victim) /* { dg-message "\\(3\\) entry to 'calls_free'" "event 3" } */
       7  /* { dg-message "\\(7\\) entry to 'calls_free'" "event 7" { target *-*-* } .-1 } */
       8  {
       9    free (victim); /* { dg-warning "double-'free' of 'victim'" "warning" } */
      10    /* { dg-message "\\(4\\) first 'free' here" "event 4" { target *-*-* } .-1 } */
      11    /* { dg-message "\\(8\\) second 'free' here; first 'free' was at \\(4\\)" "event 8" { target *-*-* } .-2 } */
      12  
      13    /* TODO: would this be better emitted at the callsite,
      14       for such a simple wrapper?  */
      15  }
      16  
      17  extern void do_stuff (void);
      18  
      19  void test (void *ptr) /* { dg-message "\\(1\\) entry to 'test'" } */
      20  {
      21    do_stuff ();
      22  
      23    calls_free (ptr); /* { dg-message "\\(2\\) calling 'calls_free' from 'test'" "event 2" } */
      24    /* { dg-message "\\(5\\) returning to 'test' from 'calls_free'" "event 5" { target *-*-* } .-1 } */
      25  
      26    do_stuff ();
      27  
      28    calls_free (ptr); /* { dg-message "\\(6\\) passing freed pointer 'ptr' in call to 'calls_free' from 'test'" } */
      29  
      30    do_stuff ();
      31  }
      32  
      33  
      34