aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/analyzer/single-field.c
blob: 31c6feead8fec78c5eb84e606ffc11906082b05d (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
35
36
37
#include <stdlib.h>
#include "analyzer-decls.h"

struct foo
{
  char *ptr;
};

void test_1 (struct foo f)
{
  __analyzer_describe (0, f.ptr); /* { dg-warning "svalue: 'INIT_VAL\\(f.ptr\\)'" } */
}

static void __analyzer_called_by_test_2 (struct foo f_inner)
{
  free (f_inner.ptr);
  free (f_inner.ptr); /* { dg-warning "double-'free' of 'f_outer.ptr'" } */
}
void test_2 (struct foo f_outer)
{
  __analyzer_called_by_test_2 (f_outer);
}

struct nested
{
  struct foo f;
};

static void __analyzer_called_by_test_3 (struct nested n_inner)
{
  free (n_inner.f.ptr);
  free (n_inner.f.ptr); /* { dg-warning "double-'free' of 'n_outer.f.ptr'" } */
}
void test_3 (struct nested n_outer)
{
  __analyzer_called_by_test_3 (n_outer);
}