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