aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/analyzer/file-paths-1.c
blob: f35017835d49e7a6440d6deb7e269d7246ccb533 (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=3" } */

typedef struct FILE   FILE;

FILE* fopen (const char*, const char*);
int   fclose (FILE*);
char *fgets (char *, int, FILE *);

#define NULL ((void *)0)


/* Verify that we correctly emit CFG events in the face of buffers
   being clobbered in these leak reports.  */

void f1 (const char *str)
{
  FILE * fp = fopen(str, "r"); /* { dg-message "opened here" } */
  char buf[10];

  while (fgets(buf, 10, fp) != NULL) /* { dg-message "following 'false' branch\\.\\.\\." } */
    {
    }
} /* { dg-warning "leak of FILE 'fp'" "warning" } */
/* { dg-message "\\.\\.\\.to here" "to here" { target *-*-* } .-1 } */

void f2(const char *str, int flag)
{
  FILE * fp = fopen(str, "r"); /* { dg-message "opened here" } */
  char buf[10];

  if (flag) /* { dg-message "when 'flag == 0'" } */
    fclose(fp);
} /* { dg-warning "leak of FILE 'fp'" "warning" } */
/* { dg-message "\\.\\.\\.to here" "to here" { target *-*-* } .-1 } */