| #include <stdlib.h> |
| #include "analyzer-decls.h" |
| |
| /* 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 "1 processed enode" } */ |
| __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 "1 processed enode" } */ |
| __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 "1 processed enode" } */ |
| __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 processed enode" } */ |
| free (p); |
| free (q); |
| } |