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