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