1 #include "analyzer-decls.h"
2
3 /* The example from store.h */
4
test_1(char a,char b,char c,char d,char e,char f,int i,int j)5 void test_1 (char a, char b, char c, char d, char e, char f,
6 int i, int j)
7 {
8 char arr[1024];
9 arr[2] = a; /* (1) */
10 arr[3] = b; /* (2) */
11
12 __analyzer_eval (arr[2] == a); /* { dg-warning "TRUE" } */
13 __analyzer_eval (arr[3] == b); /* { dg-warning "TRUE" } */
14 __analyzer_eval (arr[4]); /* { dg-warning "UNKNOWN" } */ // TODO: report uninit
15
16 /* Replace one concrete binding's value with a different value. */
17 arr[3] = c; /* (3) */
18 __analyzer_eval (arr[2] == a); /* { dg-warning "TRUE" } */
19 __analyzer_eval (arr[3] == c); /* { dg-warning "TRUE" } */
20 __analyzer_eval (arr[3] == b); /* { dg-warning "UNKNOWN" } */
21 __analyzer_eval (arr[4]); /* { dg-warning "UNKNOWN" } */ // TODO: report uninit
22
23 /* Symbolic binding. */
24 arr[i] = d; /* (4) */
25 __analyzer_eval (arr[i] == d); /* { dg-warning "TRUE" } */
26 __analyzer_eval (arr[2] == a); /* { dg-warning "UNKNOWN" } */
27 __analyzer_eval (arr[3] == c); /* { dg-warning "UNKNOWN" } */
28 __analyzer_eval (arr[4]); /* { dg-warning "UNKNOWN" } */ /* Don't report uninit. */
29
30 /* Replace symbolic binding with a different one. */
31 arr[j] = e; /* (5) */
32 __analyzer_eval (arr[j] == e); /* { dg-warning "TRUE" } */
33 __analyzer_eval (arr[i] == d); /* { dg-warning "UNKNOWN" } */
34 __analyzer_eval (arr[4]); /* { dg-warning "UNKNOWN" } */ /* Don't report uninit. */
35
36 /* Add a concrete binding. */
37 arr[3] = f; /* (6) */
38 __analyzer_eval (arr[3] == f); /* { dg-warning "TRUE" } */
39 __analyzer_eval (arr[j] == e); /* { dg-warning "UNKNOWN" } */
40 __analyzer_eval (arr[4]); /* { dg-warning "UNKNOWN" } */ /* Don't report uninit. */
41 }
42
43 // TODO: as above, but with int rather than char so there's a cast
44