array-struct.c revision f936f4568700d799e7d92eecef67b0e2b822ae7e
1// RUN: clang-cc -analyze -checker-simple -analyzer-store=basic -analyzer-constraints=basic -verify %s &&
2// RUN: clang-cc -analyze -checker-cfref -analyzer-store=basic -analyzer-constraints=basic -verify %s &&
3// RUN: clang-cc -analyze -checker-cfref -analyzer-store=basic -analyzer-constraints=range -verify %s
4
5// RegionStore now has an infinite recursion with this test case.
6// NOWORK: clang-cc -analyze -checker-cfref -analyzer-store=region -analyzer-constraints=basic -verify %s &&
7// NOWORK: clang-cc -analyze -checker-cfref -analyzer-store=region -analyzer-constraints=range -verify %s
8
9struct s {
10  int data;
11  int data_array[10];
12};
13
14typedef struct {
15  int data;
16} STYPE;
17
18void g1(struct s* p);
19
20// Array to pointer conversion. Array in the struct field.
21void f(void) {
22  int a[10];
23  int (*p)[10];
24  p = &a;
25  (*p)[3] = 1;
26
27  struct s d;
28  struct s *q;
29  q = &d;
30  q->data = 3;
31  d.data_array[9] = 17;
32}
33
34// StringLiteral in lvalue context and pointer to array type.
35// p: ElementRegion, q: StringRegion
36void f2() {
37  char *p = "/usr/local";
38  char (*q)[4];
39  q = &"abc";
40}
41
42// Typedef'ed struct definition.
43void f3() {
44  STYPE s;
45}
46
47// Initialize array with InitExprList.
48void f4() {
49  int a[] = { 1, 2, 3};
50  int b[3] = { 1, 2 };
51  struct s c[] = {{1,{1}}};
52}
53
54// Struct variable in lvalue context.
55// Assign UnknownVal to the whole struct.
56void f5() {
57  struct s data;
58  g1(&data);
59}
60
61// AllocaRegion test.
62void f6() {
63  char *p;
64  p = __builtin_alloca(10);
65  p[1] = 'a';
66}
67
68struct s2;
69
70void g2(struct s2 *p);
71
72// Incomplete struct pointer used as function argument.
73void f7() {
74  struct s2 *p = __builtin_alloca(10);
75  g2(p);
76}
77
78// sizeof() is unsigned while -1 is signed in array index.
79void f8() {
80  int a[10];
81  a[sizeof(a)/sizeof(int) - 1] = 1; // no-warning
82}
83
84// Initialization of struct array elements.
85void f9() {
86  struct s a[10];
87}
88
89// Initializing array with string literal.
90void f10() {
91  char a1[4] = "abc";
92  char a3[6] = "abc";
93}
94
95// Retrieve the default value of element/field region.
96void f11() {
97  struct s a;
98  g(&a);
99  if (a.data == 0) // no-warning
100    a.data = 1;
101}
102
103// Convert unsigned offset to signed when creating ElementRegion from
104// SymbolicRegion.
105void f12(int *list) {
106  unsigned i = 0;
107  list[i] = 1;
108}
109
110struct s1 {
111  struct s2 {
112    int d;
113  } e;
114};
115
116// The binding of a.e.d should not be removed. Test recursive subregion map
117// building: a->e, e->d. Only then 'a' could be added to live region roots.
118void f13(double timeout) {
119  struct s1 a;
120  a.e.d = (long) timeout;
121  if (a.e.d == 10)
122    a.e.d = 4;
123}
124
125struct s3 {
126  int a[2];
127};
128
129static struct s3 opt;
130
131// Test if the embedded array is retrieved correctly.
132void f14() {
133  struct s3 my_opt = opt;
134}
135