diff options
-rw-r--r-- | gcc/testsuite/gcc.dg/analyzer/explode-2a.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/analyzer/explode-2a.c b/gcc/testsuite/gcc.dg/analyzer/explode-2a.c new file mode 100644 index 0000000..126407f --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/explode-2a.c @@ -0,0 +1,51 @@ +/* PR analyzer/101068. */ + +/* { dg-additional-options "--param analyzer-max-enodes-per-program-point=200 --param analyzer-bb-explosion-factor=50" } */ + +#include <stdlib.h> + +extern int get (void); + +void test (void) +{ + void *p0, *p1, *p2, *p3; + /* Due to not purging constraints on SSA names within loops + (PR analyzer/101068), the analyzer effectively treats the original + explode-2.c as this code. */ + int a = get (); + int b = get (); + while (a) + { + switch (b) + { + default: + case 0: + p0 = malloc (16); /* { dg-warning "leak" } */ + break; + case 1: + free (p0); /* { dg-warning "double-'free' of 'p0'" "" { xfail *-*-* } } */ + break; + + case 2: + p1 = malloc (16); /* { dg-warning "leak" } */ + break; + case 3: + free (p1); /* { dg-warning "double-'free' of 'p1'" "" { xfail *-*-* } } */ + break; + + case 4: + p2 = malloc (16); /* { dg-warning "leak" } */ + break; + case 5: + free (p2); /* { dg-warning "double-'free' of 'p2'" "" { xfail *-*-* } } */ + break; + + case 6: + p3 = malloc (16); /* { dg-warning "leak" } */ + break; + case 7: + free (p3); /* { dg-warning "double-'free' of 'p3'" "" { xfail *-*-* } } */ + break; + } + } +} |