diff options
Diffstat (limited to 'gcc/testsuite/gcc.dg/analyzer/malloc-many-paths-3.c')
-rw-r--r-- | gcc/testsuite/gcc.dg/analyzer/malloc-many-paths-3.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/analyzer/malloc-many-paths-3.c b/gcc/testsuite/gcc.dg/analyzer/malloc-many-paths-3.c new file mode 100644 index 0000000..e5d27a4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/malloc-many-paths-3.c @@ -0,0 +1,36 @@ +#include <stdlib.h> + +extern int foo (void); + +int successes; +int failures; + +#define ONE_DIAMOND \ + do { \ + void *ptr = malloc (128); \ + if (foo ()) \ + successes++; \ + else \ + failures++; \ + free (ptr); \ + } while (0) + +#define TEN_DIAMONDS \ + do { \ + ONE_DIAMOND; ONE_DIAMOND; ONE_DIAMOND; ONE_DIAMOND; ONE_DIAMOND; \ + ONE_DIAMOND; ONE_DIAMOND; ONE_DIAMOND; ONE_DIAMOND; ONE_DIAMOND; \ + } while (0) + +void test_3 (void *ptr) +{ + free (ptr); +#if 1 + ONE_DIAMOND; +#else + /* TODO: enabling this leads to numerous duplicated reports, + all of them detailing all the extraneous info about the malloc/free + within the diamonds. */ + TEN_DIAMONDS; +#endif + free (ptr); /* { dg-warning "double-'free' of 'ptr'" } */ +} |