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