array-struct-region.c revision e0d24eb1060a213ec9820dc02c45f26b2d5b348b
148088ed56f406dc244f04f4e9164999b7a40e1fdJordan Rose// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core,debug.ExprInspection -analyzer-store=region -analyzer-constraints=basic -analyzer-ipa=inlining -verify %s
248088ed56f406dc244f04f4e9164999b7a40e1fdJordan Rose// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core,debug.ExprInspection -analyzer-store=region -analyzer-constraints=range -analyzer-ipa=inlining -verify %s
343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose
443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rosevoid clang_analyzer_eval(int);
523b736e159e72f0237a888a6d4f7319d7e9e8867Jordy Rose
623b736e159e72f0237a888a6d4f7319d7e9e8867Jordy Roseint string_literal_init() {
723b736e159e72f0237a888a6d4f7319d7e9e8867Jordy Rose  char a[] = "abc";
823b736e159e72f0237a888a6d4f7319d7e9e8867Jordy Rose  char b[2] = "abc"; // expected-warning{{too long}}
923b736e159e72f0237a888a6d4f7319d7e9e8867Jordy Rose  char c[5] = "abc";
1023b736e159e72f0237a888a6d4f7319d7e9e8867Jordy Rose
1143d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a[1] == 'b'); // expected-warning{{TRUE}}
1243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(b[1] == 'b'); // expected-warning{{TRUE}}
1343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(c[1] == 'b'); // expected-warning{{TRUE}}
1423b736e159e72f0237a888a6d4f7319d7e9e8867Jordy Rose
1543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a[3] == 0); // expected-warning{{TRUE}}
1643d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(c[3] == 0); // expected-warning{{TRUE}}
1723b736e159e72f0237a888a6d4f7319d7e9e8867Jordy Rose
1843d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(c[4] == 0); // expected-warning{{TRUE}}
1923b736e159e72f0237a888a6d4f7319d7e9e8867Jordy Rose
2023b736e159e72f0237a888a6d4f7319d7e9e8867Jordy Rose  return 42;
2123b736e159e72f0237a888a6d4f7319d7e9e8867Jordy Rose}
2259b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose
2359b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rosevoid nested_compound_literals(int rad) {
24be0ee875d8a91c031a085cbbd73ad9e8dc1aa8ffDavid 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}}
25be0ee875d8a91c031a085cbbd73ad9e8dc1aa8ffDavid 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}}
2659b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose  int a;
2759b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose
2859b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose  for (a = 0; a < 6; ++a) {
2959b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose      vec[a][0] *= rad; // no-warning
3059b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose      vec[a][1] *= rad; // no-warning
3159b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose  }
3259b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose}
3359b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose
3459b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rosevoid nested_compound_literals_float(float rad) {
3559b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose  float vec[6][2] = {{0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169},
3659b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose                     {0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}};
3759b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose  int a;
3859b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose
3959b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose  for (a = 0; a < 6; ++a) {
4059b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose      vec[a][0] *= rad; // no-warning
4159b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose      vec[a][1] *= rad; // no-warning
4259b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose  }
4359b6dca7e5160d6f2aff42b1cf077d1cbd64e330Jordy Rose}
44f1139400e8015b3fc4bbb125df79d9fa1ca18bf6Jordy Rose
45f1139400e8015b3fc4bbb125df79d9fa1ca18bf6Jordy Rose
46f1139400e8015b3fc4bbb125df79d9fa1ca18bf6Jordy Rosevoid struct_as_array() {
4743d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  struct simple { int x; int y; };
48f1139400e8015b3fc4bbb125df79d9fa1ca18bf6Jordy Rose  struct simple a;
49f1139400e8015b3fc4bbb125df79d9fa1ca18bf6Jordy Rose  struct simple *p = &a;
5043d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose
51f1139400e8015b3fc4bbb125df79d9fa1ca18bf6Jordy Rose  p->x = 5;
5243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a.x == 5); // expected-warning{{TRUE}}
5343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(p[0].x == 5); // expected-warning{{TRUE}}
5443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose
5543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  p[0].y = 5;
5643d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a.y == 5); // expected-warning{{TRUE}}
5743d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(p->y == 5); // expected-warning{{TRUE}}
58f1139400e8015b3fc4bbb125df79d9fa1ca18bf6Jordy Rose}
59f1139400e8015b3fc4bbb125df79d9fa1ca18bf6Jordy Rose
60752bee2493ec2931bd18899753552e3a47dc85feJordan Rose
61752bee2493ec2931bd18899753552e3a47dc85feJordan Rose// PR13264 / <rdar://problem/11802440>
62752bee2493ec2931bd18899753552e3a47dc85feJordan Rosestruct point { int x; int y; };
63752bee2493ec2931bd18899753552e3a47dc85feJordan Rosestruct circle { struct point o; int r; };
64752bee2493ec2931bd18899753552e3a47dc85feJordan Rosestruct circle get_circle() {
65752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  struct circle result;
66752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  result.r = 5;
67752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  result.o = (struct point){0, 0};
68752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  return result;
69752bee2493ec2931bd18899753552e3a47dc85feJordan Rose}
70752bee2493ec2931bd18899753552e3a47dc85feJordan Rose
71752bee2493ec2931bd18899753552e3a47dc85feJordan Rosevoid struct_in_struct() {
72752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  struct circle c;
73752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  c = get_circle();
74752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  // This used to think c.r was undefined because c.o is a LazyCompoundVal.
75752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  clang_analyzer_eval(c.r == 5); // expected-warning{{TRUE}}
76752bee2493ec2931bd18899753552e3a47dc85feJordan Rose}
77752bee2493ec2931bd18899753552e3a47dc85feJordan Rose
78752bee2493ec2931bd18899753552e3a47dc85feJordan Rose// We also test with floats because we don't model floats right now,
79752bee2493ec2931bd18899753552e3a47dc85feJordan Rose// and the original bug report used a float.
80752bee2493ec2931bd18899753552e3a47dc85feJordan Rosestruct circle_f { struct point o; float r; };
81752bee2493ec2931bd18899753552e3a47dc85feJordan Rosestruct circle_f get_circle_f() {
82752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  struct circle_f result;
83752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  result.r = 5.0;
84752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  result.o = (struct point){0, 0};
85752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  return result;
86752bee2493ec2931bd18899753552e3a47dc85feJordan Rose}
87752bee2493ec2931bd18899753552e3a47dc85feJordan Rose
88752bee2493ec2931bd18899753552e3a47dc85feJordan Rosefloat struct_in_struct_f() {
89752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  struct circle_f c;
90752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  c = get_circle_f();
91752bee2493ec2931bd18899753552e3a47dc85feJordan Rose
92752bee2493ec2931bd18899753552e3a47dc85feJordan Rose  return c.r; // no-warning
93752bee2493ec2931bd18899753552e3a47dc85feJordan Rose}
94752bee2493ec2931bd18899753552e3a47dc85feJordan Rose
95e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
96e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Roseint randomInt();
97e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
98e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Roseint testSymbolicInvalidation(int index) {
99e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  int vals[10];
100e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
101e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals[0] = 42;
102e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals[0] == 42); // expected-warning{{TRUE}}
103e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
104e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals[index] = randomInt();
105e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals[0] == 42); // expected-warning{{UNKNOWN}}
106e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
107e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  return vals[index]; // no-warning
108e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose}
109e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
110e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Roseint testConcreteInvalidation(int index) {
111e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  int vals[10];
112e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
113e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals[index] = 42;
114e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals[index] == 42); // expected-warning{{TRUE}}
115e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals[0] = randomInt();
116e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals[index] == 42); // expected-warning{{UNKNOWN}}
117e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
118e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  return vals[0]; // no-warning
119e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose}
120e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
121e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
122e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rosetypedef struct {
123e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  int x, y, z;
124e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose} S;
125e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
126e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan RoseS makeS();
127e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
128e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Roseint testSymbolicInvalidationStruct(int index) {
129e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  S vals[10];
130e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
131e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals[0].x = 42;
132e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals[0].x == 42); // expected-warning{{TRUE}}
133e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
134e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals[index] = makeS();
135e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals[0].x == 42); // expected-warning{{UNKNOWN}}
136e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
137e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  return vals[index].x; // no-warning
138e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose}
139e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
140e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Roseint testConcreteInvalidationStruct(int index) {
141e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  S vals[10];
142e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
143e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals[index].x = 42;
144e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals[index].x == 42); // expected-warning{{TRUE}}
145e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals[0] = makeS();
146e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals[index].x == 42); // expected-warning{{UNKNOWN}}
147e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
148e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  return vals[0].x; // no-warning
149e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose}
150e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
151e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rosetypedef struct {
152e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  S a[5];
153e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  S b[5];
154e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose} SS;
155e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
156e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Roseint testSymbolicInvalidationDoubleStruct(int index) {
157e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  SS vals;
158e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
159e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals.a[0].x = 42;
160e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals.b[0].x = 42;
161e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals.a[0].x == 42); // expected-warning{{TRUE}}
162e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals.b[0].x == 42); // expected-warning{{TRUE}}
163e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
164e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals.a[index] = makeS();
165e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals.a[0].x == 42); // expected-warning{{UNKNOWN}}
166e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals.b[0].x == 42); // expected-warning{{TRUE}}
167e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
168e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  return vals.b[index].x; // no-warning
169e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose}
170e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
171e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Roseint testConcreteInvalidationDoubleStruct(int index) {
172e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  SS vals;
173e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
174e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals.a[index].x = 42;
175e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals.b[index].x = 42;
176e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals.a[index].x == 42); // expected-warning{{TRUE}}
177e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals.b[index].x == 42); // expected-warning{{TRUE}}
178e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
179e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  vals.a[0] = makeS();
180e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals.a[index].x == 42); // expected-warning{{UNKNOWN}}
181e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  clang_analyzer_eval(vals.b[index].x == 42); // expected-warning{{TRUE}}
182e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
183e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose  return vals.b[0].x; // no-warning
184e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose}
185e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
186e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose
187