blob: b65ff9165e4da5c1bd730e8bc306a3618e18f2b4 [file] [log] [blame]
/* { dg-additional-options "-fdiagnostics-show-line-numbers -fdiagnostics-path-format=inline-events -fdiagnostics-show-caret" } */
/* { dg-enable-nn-line-numbers "" } */
#include <stdlib.h>
extern int some_condition ();
extern void do_stuff (int);
void
may_call_free (void *victim)
{
if (some_condition ())
return;
free (victim); /* { dg-warning "double-'free' of 'victim'" } */
}
void test (void *ptr)
{
do_stuff (1);
may_call_free (ptr);
do_stuff (2);
may_call_free (ptr);
do_stuff (3);
}
/* { dg-begin-multiline-output "" }
NN | free (victim);
| ^~~~~~~~~~~~~
'test': events 1-2
|
| NN | void test (void *ptr)
| | ^~~~
| | |
| | (1) entry to 'test'
|......
| NN | may_call_free (ptr);
| | ~~~~~~~~~~~~~~~~~~~
| | |
| | (2) calling 'may_call_free' from 'test'
|
+--> 'may_call_free': events 3-6
|
| NN | may_call_free (void *victim)
| | ^~~~~~~~~~~~~
| | |
| | (3) entry to 'may_call_free'
| NN | {
| NN | if (some_condition ())
| | ~
| | |
| | (4) following 'false' branch...
|......
| NN | free (victim);
| | ~~~~~~~~~~~~~
| | |
| | (5) ...to here
| | (6) first 'free' here
|
<------+
|
'test': events 7-8
|
| NN | may_call_free (ptr);
| | ^~~~~~~~~~~~~~~~~~~
| | |
| | (7) returning to 'test' from 'may_call_free'
|......
| NN | may_call_free (ptr);
| | ~~~~~~~~~~~~~~~~~~~
| | |
| | (8) passing freed pointer 'ptr' in call to 'may_call_free' from 'test'
|
+--> 'may_call_free': events 9-12
|
| NN | may_call_free (void *victim)
| | ^~~~~~~~~~~~~
| | |
| | (9) entry to 'may_call_free'
| NN | {
| NN | if (some_condition ())
| | ~
| | |
| | (10) following 'false' branch...
|......
| NN | free (victim);
| | ~~~~~~~~~~~~~
| | |
| | (11) ...to here
| | (12) second 'free' here; first 'free' was at (6)
|
{ dg-end-multiline-output "" } */