1cdc3a89d5de90b2299c56f4a46c3de590c5184d1Ted Kremenek// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core,debug.ExprInspection -analyzer-constraints=range -verify %s
243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose
343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rosevoid clang_analyzer_eval(int);
423b736e159e72f0237a888a6d4f7319d7e9e8867Jordy Rose
523b736e159e72f0237a888a6d4f7319d7e9e8867Jordy Roseint string_literal_init() {
623b736e159e72f0237a888a6d4f7319d7e9e8867Jordy Rose  char a[] = "abc";
723b736e159e72f0237a888a6d4f7319d7e9e8867Jordy Rose  char b[2] = "abc"; // expected-warning{{too long}}
823b736e159e72f0237a888a6d4f7319d7e9e8867Jordy Rose  char c[5] = "abc";
923b736e159e72f0237a888a6d4f7319d7e9e8867Jordy Rose
1043d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a[1] == 'b'); // expected-warning{{TRUE}}
1143d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(b[1] == 'b'); // expected-warning{{TRUE}}
1243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(c[1] == 'b'); // expected-warning{{TRUE}}
1323b736e159e72f0237a888a6d4f7319d7e9e8867Jordy Rose
1443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a[3] == 0); // expected-warning{{TRUE}}
1543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(c[3] == 0); // expected-warning{{TRUE}}
1623b736e159e72f0237a888a6d4f7319d7e9e8867Jordy Rose
1743d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(c[4] == 0); // expected-warning{{TRUE}}
1823b736e159e72f0237a888a6d4f7319d7e9e8867Jordy Rose
1923b736e159e72f0237a888a6d4f7319d7e9e8867Jordy Rose  return 42;
2023b736e159e72f0237a888a6d4f7319d7e9e8867Jordy Rose}
2159b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose
2259b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rosevoid nested_compound_literals(int rad) {
23be0ee875d8a91c031a085cbbd73ad9e8dc1aa8ffDavid Blaikie  int vec[6][2] = {{0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169},  // expected-warning 6 {{implicit conversion from 'double' to 'int' changes value from}}
24be0ee875d8a91c031a085cbbd73ad9e8dc1aa8ffDavid Blaikie                   {0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}}; // expected-warning 6 {{implicit conversion from 'double' to 'int' changes value from}}
2559b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose  int a;
2659b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose
2759b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose  for (a = 0; a < 6; ++a) {
2859b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose      vec[a][0] *= rad; // no-warning
2959b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose      vec[a][1] *= rad; // no-warning
3059b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose  }
3159b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose}
3259b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose
3359b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rosevoid nested_compound_literals_float(float rad) {
3459b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose  float vec[6][2] = {{0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169},
3559b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose                     {0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}};
3659b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose  int a;
3759b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose
3859b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose  for (a = 0; a < 6; ++a) {
3959b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose      vec[a][0] *= rad; // no-warning
4059b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose      vec[a][1] *= rad; // no-warning
4159b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose  }
4259b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose}
43f1139400e8015b3fc4bbb125df79d9fa1ca18bf6Jordy Rose
44f1139400e8015b3fc4bbb125df79d9fa1ca18bf6Jordy Rose
45f1139400e8015b3fc4bbb125df79d9fa1ca18bf6Jordy Rosevoid struct_as_array() {
4643d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  struct simple { int x; int y; };
47f1139400e8015b3fc4bbb125df79d9fa1ca18bf6Jordy Rose  struct simple a;
48f1139400e8015b3fc4bbb125df79d9fa1ca18bf6Jordy Rose  struct simple *p = &a;
4943d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose
50f1139400e8015b3fc4bbb125df79d9fa1ca18bf6Jordy Rose  p->x = 5;
5143d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a.x == 5); // expected-warning{{TRUE}}
5243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(p[0].x == 5); // expected-warning{{TRUE}}
5343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose
5443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  p[0].y = 5;
5543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a.y == 5); // expected-warning{{TRUE}}
5643d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(p->y == 5); // expected-warning{{TRUE}}
57f1139400e8015b3fc4bbb125df79d9fa1ca18bf6Jordy Rose}
58f1139400e8015b3fc4bbb125df79d9fa1ca18bf6Jordy Rose
59752bee2493ec2931bd18899753552e3a47dc85feJordan Rose
60752bee2493ec2931bd18899753552e3a47dc85feJordan Rose// PR13264 / <rdar://problem/11802440>
61752bee2493ec2931bd18899753552e3a47dc85feJordan Rosestruct point { int x; int y; };
62752bee2493ec2931bd18899753552e3a47dc85feJordan Rosestruct circle { struct point o; int r; };
63752bee2493ec2931bd18899753552e3a47dc85feJordan Rosestruct circle get_circle() {
64752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  struct circle result;
65752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  result.r = 5;
66752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  result.o = (struct point){0, 0};
67752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  return result;
68752bee2493ec2931bd18899753552e3a47dc85feJordan Rose}
69752bee2493ec2931bd18899753552e3a47dc85feJordan Rose
70752bee2493ec2931bd18899753552e3a47dc85feJordan Rosevoid struct_in_struct() {
71752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  struct circle c;
72752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  c = get_circle();
73752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  // This used to think c.r was undefined because c.o is a LazyCompoundVal.
74752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  clang_analyzer_eval(c.r == 5); // expected-warning{{TRUE}}
75752bee2493ec2931bd18899753552e3a47dc85feJordan Rose}
76752bee2493ec2931bd18899753552e3a47dc85feJordan Rose
77752bee2493ec2931bd18899753552e3a47dc85feJordan Rose// We also test with floats because we don't model floats right now,
78752bee2493ec2931bd18899753552e3a47dc85feJordan Rose// and the original bug report used a float.
79752bee2493ec2931bd18899753552e3a47dc85feJordan Rosestruct circle_f { struct point o; float r; };
80752bee2493ec2931bd18899753552e3a47dc85feJordan Rosestruct circle_f get_circle_f() {
81752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  struct circle_f result;
82752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  result.r = 5.0;
83752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  result.o = (struct point){0, 0};
84752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  return result;
85752bee2493ec2931bd18899753552e3a47dc85feJordan Rose}
86752bee2493ec2931bd18899753552e3a47dc85feJordan Rose
87752bee2493ec2931bd18899753552e3a47dc85feJordan Rosefloat struct_in_struct_f() {
88752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  struct circle_f c;
89752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  c = get_circle_f();
90752bee2493ec2931bd18899753552e3a47dc85feJordan Rose
91752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  return c.r; // no-warning
92752bee2493ec2931bd18899753552e3a47dc85feJordan Rose}
93752bee2493ec2931bd18899753552e3a47dc85feJordan Rose
94e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
95e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Roseint randomInt();
96e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
97e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Roseint testSymbolicInvalidation(int index) {
98e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  int vals[10];
99e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
100e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals[0] = 42;
101e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals[0] == 42); // expected-warning{{TRUE}}
102e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
103e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals[index] = randomInt();
104e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals[0] == 42); // expected-warning{{UNKNOWN}}
105e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
106e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  return vals[index]; // no-warning
107e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose}
108e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
109e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Roseint testConcreteInvalidation(int index) {
110e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  int vals[10];
111e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
112e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals[index] = 42;
113e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals[index] == 42); // expected-warning{{TRUE}}
114e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals[0] = randomInt();
115e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals[index] == 42); // expected-warning{{UNKNOWN}}
116e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
117e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  return vals[0]; // no-warning
118e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose}
119e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
120e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
121e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rosetypedef struct {
122e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  int x, y, z;
123e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose} S;
124e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
125e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan RoseS makeS();
126e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
127e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Roseint testSymbolicInvalidationStruct(int index) {
128e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  S vals[10];
129e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
130e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals[0].x = 42;
131e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals[0].x == 42); // expected-warning{{TRUE}}
132e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
133e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals[index] = makeS();
134e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals[0].x == 42); // expected-warning{{UNKNOWN}}
135e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
136e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  return vals[index].x; // no-warning
137e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose}
138e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
139e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Roseint testConcreteInvalidationStruct(int index) {
140e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  S vals[10];
141e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
142e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals[index].x = 42;
143e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals[index].x == 42); // expected-warning{{TRUE}}
144e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals[0] = makeS();
145e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals[index].x == 42); // expected-warning{{UNKNOWN}}
146e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
147e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  return vals[0].x; // no-warning
148e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose}
149e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
150e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rosetypedef struct {
151e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  S a[5];
152e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  S b[5];
153e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose} SS;
154e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
155e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Roseint testSymbolicInvalidationDoubleStruct(int index) {
156e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  SS vals;
157e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
158e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals.a[0].x = 42;
159e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals.b[0].x = 42;
160e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals.a[0].x == 42); // expected-warning{{TRUE}}
161e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals.b[0].x == 42); // expected-warning{{TRUE}}
162e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
163e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals.a[index] = makeS();
164e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals.a[0].x == 42); // expected-warning{{UNKNOWN}}
165e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals.b[0].x == 42); // expected-warning{{TRUE}}
166e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
167e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  return vals.b[index].x; // no-warning
168e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose}
169e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
170e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Roseint testConcreteInvalidationDoubleStruct(int index) {
171e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  SS vals;
172e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
173e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals.a[index].x = 42;
174e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals.b[index].x = 42;
175e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals.a[index].x == 42); // expected-warning{{TRUE}}
176e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals.b[index].x == 42); // expected-warning{{TRUE}}
177e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
178e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals.a[0] = makeS();
179e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals.a[index].x == 42); // expected-warning{{UNKNOWN}}
180e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals.b[index].x == 42); // expected-warning{{TRUE}}
181e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
182e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  return vals.b[0].x; // no-warning
183e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose}
184e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
185e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
1864e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Roseint testNonOverlappingStructFieldsSimple() {
1874e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  S val;
1884e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
1894e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  val.x = 1;
1904e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  val.y = 2;
1914e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(val.x == 1); // expected-warning{{TRUE}}
1924e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(val.y == 2); // expected-warning{{TRUE}}
1934e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
1944e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  return val.z; // expected-warning{{garbage}}
1954e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose}
1964e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
1974e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Roseint testNonOverlappingStructFieldsSymbolicBase(int index, int anotherIndex) {
1984e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  SS vals;
1994e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
2004e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  vals.a[index].x = 42;
2014e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  vals.a[index].y = 42;
2024e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals.a[index].x == 42); // expected-warning{{TRUE}}
2034e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals.a[index].y == 42); // expected-warning{{TRUE}}
2044e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
2054e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  vals.a[anotherIndex].x = 42;
2064e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals.a[index].x == 42); // expected-warning{{UNKNOWN}}
2074e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals.a[index].y == 42); // expected-warning{{TRUE}}
2084e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
2094e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  // FIXME: False negative. No bind ever set a field 'z'.
2104e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  return vals.a[index].z; // no-warning
2114e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose}
2124e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
2134e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Roseint testStructFieldChains(int index, int anotherIndex) {
2144e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  SS vals[4];
2154e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
2164e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  vals[index].a[0].x = 42;
2174e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  vals[anotherIndex].a[1].y = 42;
2184e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals[index].a[0].x == 42); // expected-warning{{TRUE}}
2194e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals[anotherIndex].a[1].y == 42); // expected-warning{{TRUE}}
2204e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
2214e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  // This doesn't affect anything in the 'a' array field.
2224e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  vals[anotherIndex].b[1].x = 42;
2234e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals[index].a[0].x == 42); // expected-warning{{TRUE}}
2244e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals[anotherIndex].a[1].y == 42); // expected-warning{{TRUE}}
2254e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals[anotherIndex].b[1].x == 42); // expected-warning{{TRUE}}
2264e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
2274e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  // This doesn't affect anything in the 'b' array field.
2284e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  vals[index].a[anotherIndex].x = 42;
2294e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals[index].a[0].x == 42); // expected-warning{{UNKNOWN}}
2304e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals[anotherIndex].a[0].x == 42); // expected-warning{{UNKNOWN}}
2314e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals[anotherIndex].a[1].y == 42); // expected-warning{{TRUE}}
2324e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals[anotherIndex].b[1].x == 42); // expected-warning{{TRUE}}
2334e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
2344e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  // FIXME: False negative. No bind ever set a field 'z'.
2354e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  return vals[index].a[0].z; // no-warning
2364e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose}
2374e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
2384e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Roseint testStructFieldChainsNested(int index, int anotherIndex) {
2394e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  SS vals[4];
2404e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
2414e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  vals[index].a[0].x = 42;
2424e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals[index].a[0].x == 42); // expected-warning{{TRUE}}
2434e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
2444e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  vals[index].b[0] = makeS();
2454e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals[index].a[0].x == 42); // expected-warning{{TRUE}}
2464e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
2474e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  vals[index].a[0] = makeS();
2484e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals[index].a[0].x == 42); // expected-warning{{UNKNOWN}}
2494e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
2504e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  vals[index].a[0].x = 42;
2514e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals[index].a[0].x == 42); // expected-warning{{TRUE}}
2524e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
2534e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  return 0;
2544e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose}
2554e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
2565255f27362ffbfedea889870bf8d5812dae97553Anna Zakstypedef struct {
2575255f27362ffbfedea889870bf8d5812dae97553Anna Zaks  int zoomLevel;
2585255f27362ffbfedea889870bf8d5812dae97553Anna Zaks  struct point center;
2595255f27362ffbfedea889870bf8d5812dae97553Anna Zaks} Outer;
2605255f27362ffbfedea889870bf8d5812dae97553Anna Zaks
2615255f27362ffbfedea889870bf8d5812dae97553Anna Zaksextern int test13116945(struct point x);
2625255f27362ffbfedea889870bf8d5812dae97553Anna Zaksstatic void radar13116945(struct point centerCoordinate) {
2635255f27362ffbfedea889870bf8d5812dae97553Anna Zaks  Outer zoomRegion;
2645255f27362ffbfedea889870bf8d5812dae97553Anna Zaks  zoomRegion.zoomLevel = 0;
2655255f27362ffbfedea889870bf8d5812dae97553Anna Zaks  zoomRegion.center = centerCoordinate;
2665255f27362ffbfedea889870bf8d5812dae97553Anna Zaks  Outer r = zoomRegion;
2675255f27362ffbfedea889870bf8d5812dae97553Anna Zaks  test13116945(r.center); // no-warning
2685255f27362ffbfedea889870bf8d5812dae97553Anna Zaks}
2694e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
270978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose
271978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rosetypedef struct {
272978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  char data[4];
273978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose} ShortString;
274978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose
275978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rosetypedef struct {
276978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  ShortString str;
277978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  int length;
278978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose} ShortStringWrapper;
279978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose
280978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rosevoid testArrayStructCopy() {
281978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  ShortString s = { "abc" };
282978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  ShortString s2 = s;
283978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  ShortString s3 = s2;
284978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose
285978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  clang_analyzer_eval(s3.data[0] == 'a'); // expected-warning{{TRUE}}
286978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  clang_analyzer_eval(s3.data[1] == 'b'); // expected-warning{{TRUE}}
287978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  clang_analyzer_eval(s3.data[2] == 'c'); // expected-warning{{TRUE}}
28811f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose
28911f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose  s3.data[0] = 'z';
29011f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose  ShortString s4 = s3;
29111f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose
29211f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose  clang_analyzer_eval(s4.data[0] == 'z'); // expected-warning{{TRUE}}
29311f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose  clang_analyzer_eval(s4.data[1] == 'b'); // expected-warning{{TRUE}}
29411f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose  clang_analyzer_eval(s4.data[2] == 'c'); // expected-warning{{TRUE}}
295978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose}
296978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose
297978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rosevoid testArrayStructCopyNested() {
298978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  ShortString s = { "abc" };
299978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  ShortString s2 = s;
300978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose
301978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  ShortStringWrapper w = { s2, 0 };
302978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose
303978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  clang_analyzer_eval(w.str.data[0] == 'a'); // expected-warning{{TRUE}}
304978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  clang_analyzer_eval(w.str.data[1] == 'b'); // expected-warning{{TRUE}}
305978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  clang_analyzer_eval(w.str.data[2] == 'c'); // expected-warning{{TRUE}}
306978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  clang_analyzer_eval(w.length == 0); // expected-warning{{TRUE}}
307978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose
308978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  ShortStringWrapper w2 = w;
309978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  clang_analyzer_eval(w2.str.data[0] == 'a'); // expected-warning{{TRUE}}
310978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  clang_analyzer_eval(w2.str.data[1] == 'b'); // expected-warning{{TRUE}}
311978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  clang_analyzer_eval(w2.str.data[2] == 'c'); // expected-warning{{TRUE}}
312978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  clang_analyzer_eval(w2.length == 0); // expected-warning{{TRUE}}
313978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose
314978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  ShortStringWrapper w3 = w2;
315978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  clang_analyzer_eval(w3.str.data[0] == 'a'); // expected-warning{{TRUE}}
316978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  clang_analyzer_eval(w3.str.data[1] == 'b'); // expected-warning{{TRUE}}
317978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  clang_analyzer_eval(w3.str.data[2] == 'c'); // expected-warning{{TRUE}}
318978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose  clang_analyzer_eval(w3.length == 0); // expected-warning{{TRUE}}
319978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose}
320978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Rose
3214e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose// --------------------
3224e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose// False positives
3234e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose// --------------------
3244e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
3254e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Roseint testMixSymbolicAndConcrete(int index, int anotherIndex) {
3264e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  SS vals;
3274e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
3284e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  vals.a[index].x = 42;
3294e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  vals.a[0].y = 42;
3304e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
3314e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  // FIXME: Should be TRUE.
3324e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals.a[index].x == 42); // expected-warning{{UNKNOWN}}
3334e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  // Should be TRUE; we set this explicitly.
3344e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals.a[0].y == 42); // expected-warning{{TRUE}}
3354e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
3364e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  vals.a[anotherIndex].y = 42;
3374e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
3384e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  // Should be UNKNOWN; we set an 'x'.
3394e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals.a[index].x == 42); // expected-warning{{UNKNOWN}}
3404e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  // FIXME: Should be TRUE.
3414e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals.a[0].y == 42); // expected-warning{{UNKNOWN}}
3424e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
3434e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  return vals.a[0].x; // no-warning
3444e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose}
3454e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
3464e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rosevoid testFieldChainIsNotEnough(int index) {
3474e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  SS vals[4];
3484e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
3494e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  vals[index].a[0].x = 42;
3504e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals[index].a[0].x == 42); // expected-warning{{TRUE}}
3514e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose
3524e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  vals[index].a[1] = makeS();
3534e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  // FIXME: Should be TRUE.
3544e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose  clang_analyzer_eval(vals[index].a[0].x == 42); // expected-warning{{UNKNOWN}}
3554e674f77150b52d8e6ae82faf64fbdac79d675d3Jordan Rose}
356