array-struct-region.c revision 752bee2493ec2931bd18899753552e3a47dc85fe
1752bee2493ec2931bd18899753552e3a47dc85feJordan Rose// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core,debug.ExprInspection -analyzer-store=region -analyzer-constraints=basic -analyzer-ipa=all -verify %s
2752bee2493ec2931bd18899753552e3a47dc85feJordan Rose// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core,debug.ExprInspection -analyzer-store=region -analyzer-constraints=range -analyzer-ipa=all -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
95