aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/analyzer/malloc-ipa-2.c
blob: 800dd63a031a068f544905b41741327638614183 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/* { dg-additional-options "-fanalyzer-verbosity=1" } */

#include <stdlib.h>

void
calls_free (void *victim) /* { dg-message "\\(3\\) entry to 'calls_free'" "event 3" } */
/* { dg-message "\\(7\\) entry to 'calls_free'" "event 7" { target *-*-* } .-1 } */
{
  free (victim); /* { dg-warning "double-'free' of 'victim'" "warning" } */
  /* { dg-message "\\(4\\) first 'free' here" "event 4" { target *-*-* } .-1 } */
  /* { dg-message "\\(8\\) second 'free' here; first 'free' was at \\(4\\)" "event 8" { target *-*-* } .-2 } */

  /* TODO: would this be better emitted at the callsite,
     for such a simple wrapper?  */
}

extern void do_stuff (void);

void test (void *ptr) /* { dg-message "\\(1\\) entry to 'test'" } */
{
  do_stuff ();

  calls_free (ptr); /* { dg-message "\\(2\\) calling 'calls_free' from 'test'" "event 2" } */
  /* { dg-message "\\(5\\) returning to 'test' from 'calls_free'" "event 5" { target *-*-* } .-1 } */

  do_stuff ();

  calls_free (ptr); /* { dg-message "\\(6\\) passing freed pointer 'ptr' in call to 'calls_free' from 'test'" } */

  do_stuff ();
}