From 3812d68816eee9c7e7624927e9989d267f3b019b Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Mon, 8 Jul 2019 10:21:31 -0400 Subject: [PATCH 064/108] FIXME: paths-6.c --- gcc/testsuite/gcc.dg/analyzer/paths-6.c | 123 ++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/analyzer/paths-6.c diff --git a/gcc/testsuite/gcc.dg/analyzer/paths-6.c b/gcc/testsuite/gcc.dg/analyzer/paths-6.c new file mode 100644 index 0000000..fa268fc --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/paths-6.c @@ -0,0 +1,123 @@ +/* { dg-additional-options "-fanalyzer-state-merge" } */ + +#include + +/* Verify that ordering of writes doesn't matter when merging states. */ + +/* Test with locals. */ + +void test_1 (int flag) +{ + int a, b; + if (flag) + { + a = 3; + b = 4; + } + else + { + b = 4; + a = 3; + } + + __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */ + // FIXME: the above can vary between 2 and 3 exploded nodes + __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */ + __analyzer_eval (a == 3); /* { dg-warning "TRUE" } */ + __analyzer_eval (b == 4); /* { dg-warning "TRUE" } */ +} + +/* Test with globals. */ + +int f, g, h; +void test_2 (int flag) +{ + if (flag) + { + f = 3; + g = 4; + } + else + { + g = 4; + f = 3; + } + + __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */ + // FIXME: the above can vary between 2 and 3 exploded nodes + __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */ + __analyzer_eval (f == 3); /* { dg-warning "TRUE" } */ + __analyzer_eval (g == 4); /* { dg-warning "TRUE" } */ +} + +/* All 6 orderings of writes to 3 globals. */ + +void test_3 (int i) +{ + switch (i) + { + default: + case 0: + f = 3; + g = 4; + h = 5; + break; + + case 1: + f = 3; + h = 5; + g = 4; + break; + + case 2: + g = 4; + f = 3; + h = 5; + break; + + case 3: + g = 4; + h = 5; + f = 3; + break; + + case 4: + h = 5; + f = 3; + g = 4; + break; + + case 5: + h = 5; + g = 4; + f = 3; + break; + } + + __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */ + // FIXME: the above can vary between 2 and 3 exploded nodes + __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */ + __analyzer_eval (f == 3); /* { dg-warning "TRUE" } */ + __analyzer_eval (g == 4); /* { dg-warning "TRUE" } */ + __analyzer_eval (h == 5); /* { dg-warning "TRUE" } */ +} + +void test_4 (int flag) +{ + void *p, *q; + if (flag) + { + p = malloc (256); + q = malloc (256); + } + else + { + q = malloc (256); + p = malloc (256); + } + __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */ + __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */ + // FIXME: should the above be 1 node? + free (p); + free (q); +} -- 1.8.5.3