1cdc3a89d5de90b2299c56f4a46c3de590c5184d1Ted Kremenek// RUN: %clang_cc1 -analyze -analyzer-checker=alpha.core.FixedAddr,alpha.core.PointerArithm,alpha.core.PointerSub,debug.ExprInspection -analyzer-store=region -verify -triple x86_64-apple-darwin9 %s 2cdc3a89d5de90b2299c56f4a46c3de590c5184d1Ted Kremenek// RUN: %clang_cc1 -analyze -analyzer-checker=alpha.core.FixedAddr,alpha.core.PointerArithm,alpha.core.PointerSub,debug.ExprInspection -analyzer-store=region -verify -triple i686-apple-darwin9 %s 3e184b1e4e06c059a8360fae4c9b5ea00fd62014dZhongxing Xu 443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rosevoid clang_analyzer_eval(int); 5eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose 6e184b1e4e06c059a8360fae4c9b5ea00fd62014dZhongxing Xuvoid f1() { 7e184b1e4e06c059a8360fae4c9b5ea00fd62014dZhongxing Xu int a[10]; 8e184b1e4e06c059a8360fae4c9b5ea00fd62014dZhongxing Xu int *p = a; 9e184b1e4e06c059a8360fae4c9b5ea00fd62014dZhongxing Xu ++p; 10e184b1e4e06c059a8360fae4c9b5ea00fd62014dZhongxing Xu} 112b1dc179197955bfa79583b13bedb1dc8bcdf25dZhongxing Xu 122b1dc179197955bfa79583b13bedb1dc8bcdf25dZhongxing Xuchar* foo(); 132b1dc179197955bfa79583b13bedb1dc8bcdf25dZhongxing Xu 142b1dc179197955bfa79583b13bedb1dc8bcdf25dZhongxing Xuvoid f2() { 152b1dc179197955bfa79583b13bedb1dc8bcdf25dZhongxing Xu char *p = foo(); 162b1dc179197955bfa79583b13bedb1dc8bcdf25dZhongxing Xu ++p; 172b1dc179197955bfa79583b13bedb1dc8bcdf25dZhongxing Xu} 183c4b37980ad5582409fa9a99ac29da8ab59f1ed0Zhongxing Xu 19e8cba00b40ce8a31e8d2ee6f3ca8243cd1e37719Zhongxing Xu// This test case checks if we get the right rvalue type of a TypedViewRegion. 20e8cba00b40ce8a31e8d2ee6f3ca8243cd1e37719Zhongxing Xu// The ElementRegion's type depends on the array region's rvalue type. If it was 21e8cba00b40ce8a31e8d2ee6f3ca8243cd1e37719Zhongxing Xu// a pointer type, we would get a loc::SymbolVal for '*p'. 220b308ad34ffb29e508b681b155696f8f999532bbEli Friedmanvoid* memchr(); 233c4b37980ad5582409fa9a99ac29da8ab59f1ed0Zhongxing Xustatic int 243c4b37980ad5582409fa9a99ac29da8ab59f1ed0Zhongxing Xudomain_port (const char *domain_b, const char *domain_e, 253c4b37980ad5582409fa9a99ac29da8ab59f1ed0Zhongxing Xu const char **domain_e_ptr) 263c4b37980ad5582409fa9a99ac29da8ab59f1ed0Zhongxing Xu{ 273c4b37980ad5582409fa9a99ac29da8ab59f1ed0Zhongxing Xu int port = 0; 283c4b37980ad5582409fa9a99ac29da8ab59f1ed0Zhongxing Xu 293c4b37980ad5582409fa9a99ac29da8ab59f1ed0Zhongxing Xu const char *p; 303c4b37980ad5582409fa9a99ac29da8ab59f1ed0Zhongxing Xu const char *colon = memchr (domain_b, ':', domain_e - domain_b); 313c4b37980ad5582409fa9a99ac29da8ab59f1ed0Zhongxing Xu 323c4b37980ad5582409fa9a99ac29da8ab59f1ed0Zhongxing Xu for (p = colon + 1; p < domain_e ; p++) 333c4b37980ad5582409fa9a99ac29da8ab59f1ed0Zhongxing Xu port = 10 * port + (*p - '0'); 343c4b37980ad5582409fa9a99ac29da8ab59f1ed0Zhongxing Xu return port; 353c4b37980ad5582409fa9a99ac29da8ab59f1ed0Zhongxing Xu} 363ce2dc358ea951c384fa27bcf2ba4a222c2c0511Zhongxing Xu 373ce2dc358ea951c384fa27bcf2ba4a222c2c0511Zhongxing Xuvoid f3() { 383ce2dc358ea951c384fa27bcf2ba4a222c2c0511Zhongxing Xu int x, y; 39c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek int d = &y - &x; // expected-warning{{Subtraction of two pointers that do not point to the same memory chunk may cause incorrect result}} 40adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu 41adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu int a[10]; 42adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu int *p = &a[2]; 43adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu int *q = &a[8]; 44adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu d = q-p; // no-warning 453ce2dc358ea951c384fa27bcf2ba4a222c2c0511Zhongxing Xu} 46b10a7c235f82c6eb074be097c9ae7ee51fccc9c6Zhongxing Xu 47b10a7c235f82c6eb074be097c9ae7ee51fccc9c6Zhongxing Xuvoid f4() { 48b10a7c235f82c6eb074be097c9ae7ee51fccc9c6Zhongxing Xu int *p; 49c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek p = (int*) 0x10000; // expected-warning{{Using a fixed address is not portable because that address will probably not be valid in all environments or platforms}} 50b10a7c235f82c6eb074be097c9ae7ee51fccc9c6Zhongxing Xu} 51ede7eb251778cd64e76cd09ea941b0f4064d38a1Zhongxing Xu 52ede7eb251778cd64e76cd09ea941b0f4064d38a1Zhongxing Xuvoid f5() { 53ede7eb251778cd64e76cd09ea941b0f4064d38a1Zhongxing Xu int x, y; 54ede7eb251778cd64e76cd09ea941b0f4064d38a1Zhongxing Xu int *p; 55c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek p = &x + 1; // expected-warning{{Pointer arithmetic done on non-array variables means reliance on memory layout, which is dangerous}} 56ede7eb251778cd64e76cd09ea941b0f4064d38a1Zhongxing Xu 57ede7eb251778cd64e76cd09ea941b0f4064d38a1Zhongxing Xu int a[10]; 58ede7eb251778cd64e76cd09ea941b0f4064d38a1Zhongxing Xu p = a + 1; // no-warning 59ede7eb251778cd64e76cd09ea941b0f4064d38a1Zhongxing Xu} 6079234ca446858707fa311cd0dfea85519ba3bbd5Zhongxing Xu 6179234ca446858707fa311cd0dfea85519ba3bbd5Zhongxing Xu// Allow arithmetic on different symbolic regions. 6279234ca446858707fa311cd0dfea85519ba3bbd5Zhongxing Xuvoid f6(int *p, int *q) { 6379234ca446858707fa311cd0dfea85519ba3bbd5Zhongxing Xu int d = q - p; // no-warning 6479234ca446858707fa311cd0dfea85519ba3bbd5Zhongxing Xu} 65eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose 66eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rosevoid null_operand(int *a) { 67eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rosestart: 68eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose // LHS is a label, RHS is NULL 6943d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(&&start != 0); // expected-warning{{TRUE}} 7043d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(&&start >= 0); // expected-warning{{TRUE}} 7143d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(&&start > 0); // expected-warning{{TRUE}} 7243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval((&&start - 0) != 0); // expected-warning{{TRUE}} 73eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose 74eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose // LHS is a non-symbolic value, RHS is NULL 7543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(&a != 0); // expected-warning{{TRUE}} 7643d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(&a >= 0); // expected-warning{{TRUE}} 7743d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(&a > 0); // expected-warning{{TRUE}} 7843d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval((&a - 0) != 0); // expected-warning{{TRUE}} expected-warning{{Pointer arithmetic done on non-array variables}} 79eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose 80eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose // LHS is NULL, RHS is non-symbolic 81eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose // The same code is used for labels and non-symbolic values. 8243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(0 != &a); // expected-warning{{TRUE}} 8343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(0 <= &a); // expected-warning{{TRUE}} 8443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(0 < &a); // expected-warning{{TRUE}} 85eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose 86eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose // LHS is a symbolic value, RHS is NULL 8743d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a != 0); // expected-warning{{UNKNOWN}} 8843d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a >= 0); // expected-warning{{TRUE}} 8943d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a <= 0); // expected-warning{{UNKNOWN}} 9043d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval((a - 0) != 0); // expected-warning{{UNKNOWN}} 91eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose 92eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose // LHS is NULL, RHS is a symbolic value 9343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(0 != a); // expected-warning{{UNKNOWN}} 9443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(0 <= a); // expected-warning{{TRUE}} 9543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(0 < a); // expected-warning{{UNKNOWN}} 96eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose} 97eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose 98eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rosevoid const_locs() { 99eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose char *a = (char*)0x1000; 100eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose char *b = (char*)0x1100; 101eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rosestart: 10243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a != b); // expected-warning{{TRUE}} 10343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a < b); // expected-warning{{TRUE}} 10443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a <= b); // expected-warning{{TRUE}} 10543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval((b-a) == 0x100); // expected-warning{{TRUE}} 10643d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose 10743d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(&&start == a); // expected-warning{{UNKNOWN}} 10843d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a == &&start); // expected-warning{{UNKNOWN}} 10943d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(&a == (char**)a); // expected-warning{{UNKNOWN}} 11043d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval((char**)a == &a); // expected-warning{{UNKNOWN}} 111eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose} 112eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose 113eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rosevoid array_matching_types() { 114eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose int array[10]; 115eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose int *a = &array[2]; 116eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose int *b = &array[5]; 117eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose 11843d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a != b); // expected-warning{{TRUE}} 11943d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a < b); // expected-warning{{TRUE}} 12043d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a <= b); // expected-warning{{TRUE}} 12143d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval((b-a) != 0); // expected-warning{{TRUE}} 122eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose} 123eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose 124eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose// This takes a different code path than array_matching_types() 125eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rosevoid array_different_types() { 126eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose int array[10]; 127eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose int *a = &array[2]; 128eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose char *b = (char*)&array[5]; 129eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose 13043d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a != b); // expected-warning{{TRUE}} expected-warning{{comparison of distinct pointer types}} 13143d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a < b); // expected-warning{{TRUE}} expected-warning{{comparison of distinct pointer types}} 13243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a <= b); // expected-warning{{TRUE}} expected-warning{{comparison of distinct pointer types}} 133eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose} 134eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose 135eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rosestruct test { int x; int y; }; 136eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rosevoid struct_fields() { 137eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose struct test a, b; 138eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose 13943d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(&a.x != &a.y); // expected-warning{{TRUE}} 14043d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(&a.x < &a.y); // expected-warning{{TRUE}} 14143d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(&a.x <= &a.y); // expected-warning{{TRUE}} 142eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose 14343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(&a.x != &b.x); // expected-warning{{TRUE}} 14443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(&a.x > &b.x); // expected-warning{{UNKNOWN}} 14543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(&a.x >= &b.x); // expected-warning{{UNKNOWN}} 146eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose} 147eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose 148eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rosevoid mixed_region_types() { 149eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose struct test s; 150eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose int array[2]; 151eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose void *a = &array, *b = &s; 152eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose 15343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(&a != &b); // expected-warning{{TRUE}} 15443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(&a > &b); // expected-warning{{UNKNOWN}} 15543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(&a >= &b); // expected-warning{{UNKNOWN}} 156eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose} 157eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose 158eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rosevoid symbolic_region(int *p) { 159eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose int a; 160eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose 16143d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(&a != p); // expected-warning{{TRUE}} 16243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(&a > p); // expected-warning{{UNKNOWN}} 16343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(&a >= p); // expected-warning{{UNKNOWN}} 164eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose} 165a274148a5cf85f758e469d5785fb72736f93f58bJordy Rose 166a274148a5cf85f758e469d5785fb72736f93f58bJordy Rosevoid PR7527 (int *p) { 167a274148a5cf85f758e469d5785fb72736f93f58bJordy Rose if (((int) p) & 1) // not crash 168a274148a5cf85f758e469d5785fb72736f93f58bJordy Rose return; 169a274148a5cf85f758e469d5785fb72736f93f58bJordy Rose} 1708958efacf8d52918cfe624116338bec62312582dJordan Rose 1718958efacf8d52918cfe624116338bec62312582dJordan Rosevoid use_symbols(int *lhs, int *rhs) { 1728958efacf8d52918cfe624116338bec62312582dJordan Rose clang_analyzer_eval(lhs < rhs); // expected-warning{{UNKNOWN}} 1738958efacf8d52918cfe624116338bec62312582dJordan Rose if (lhs < rhs) 1748958efacf8d52918cfe624116338bec62312582dJordan Rose return; 1758958efacf8d52918cfe624116338bec62312582dJordan Rose clang_analyzer_eval(lhs < rhs); // expected-warning{{FALSE}} 1768958efacf8d52918cfe624116338bec62312582dJordan Rose 1778958efacf8d52918cfe624116338bec62312582dJordan Rose clang_analyzer_eval(lhs - rhs); // expected-warning{{UNKNOWN}} 1788958efacf8d52918cfe624116338bec62312582dJordan Rose if ((lhs - rhs) != 5) 1798958efacf8d52918cfe624116338bec62312582dJordan Rose return; 1808958efacf8d52918cfe624116338bec62312582dJordan Rose clang_analyzer_eval((lhs - rhs) == 5); // expected-warning{{TRUE}} 1818958efacf8d52918cfe624116338bec62312582dJordan Rose} 18278114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose 18378114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rosevoid equal_implies_zero(int *lhs, int *rhs) { 18478114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose clang_analyzer_eval(lhs == rhs); // expected-warning{{UNKNOWN}} 18578114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose if (lhs == rhs) { 18678114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose clang_analyzer_eval(lhs != rhs); // expected-warning{{FALSE}} 18778114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose clang_analyzer_eval((rhs - lhs) == 0); // expected-warning{{TRUE}} 18878114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose return; 18978114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose } 19078114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose clang_analyzer_eval(lhs == rhs); // expected-warning{{FALSE}} 19178114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose clang_analyzer_eval(lhs != rhs); // expected-warning{{TRUE}} 19278114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose clang_analyzer_eval((rhs - lhs) == 0); // expected-warning{{FALSE}} 19378114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose} 19478114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose 19578114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rosevoid zero_implies_equal(int *lhs, int *rhs) { 19678114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose clang_analyzer_eval((rhs - lhs) == 0); // expected-warning{{UNKNOWN}} 19778114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose if ((rhs - lhs) == 0) { 19878114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose clang_analyzer_eval(lhs != rhs); // expected-warning{{FALSE}} 19978114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose clang_analyzer_eval(lhs == rhs); // expected-warning{{TRUE}} 20078114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose return; 20178114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose } 20278114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose clang_analyzer_eval((rhs - lhs) == 0); // expected-warning{{FALSE}} 20378114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose clang_analyzer_eval(lhs == rhs); // expected-warning{{FALSE}} 20478114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose clang_analyzer_eval(lhs != rhs); // expected-warning{{TRUE}} 20578114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose} 20678114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose 207281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rosevoid comparisons_imply_size(int *lhs, int *rhs) { 208281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose clang_analyzer_eval(lhs <= rhs); // expected-warning{{UNKNOWN}} 209281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose 210281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose if (lhs > rhs) { 211281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose clang_analyzer_eval((rhs - lhs) == 0); // expected-warning{{FALSE}} 212281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose return; 213281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose } 214281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose 215281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose clang_analyzer_eval(lhs <= rhs); // expected-warning{{TRUE}} 216281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose clang_analyzer_eval((rhs - lhs) >= 0); // expected-warning{{TRUE}} 217281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose clang_analyzer_eval((rhs - lhs) > 0); // expected-warning{{UNKNOWN}} 218281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose 219281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose if (lhs >= rhs) { 220281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose clang_analyzer_eval((rhs - lhs) == 0); // expected-warning{{TRUE}} 221281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose return; 222281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose } 223281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose 224281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose clang_analyzer_eval(lhs == rhs); // expected-warning{{FALSE}} 225281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose clang_analyzer_eval(lhs < rhs); // expected-warning{{TRUE}} 226281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose clang_analyzer_eval((rhs - lhs) > 0); // expected-warning{{TRUE}} 227281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose} 228281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose 229281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rosevoid size_implies_comparison(int *lhs, int *rhs) { 230281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose clang_analyzer_eval(lhs <= rhs); // expected-warning{{UNKNOWN}} 231281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose 232281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose if ((rhs - lhs) < 0) { 233281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose clang_analyzer_eval(lhs == rhs); // expected-warning{{FALSE}} 234281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose return; 235281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose } 236281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose 237281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose clang_analyzer_eval(lhs <= rhs); // expected-warning{{TRUE}} 238281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose clang_analyzer_eval((rhs - lhs) >= 0); // expected-warning{{TRUE}} 239281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose clang_analyzer_eval((rhs - lhs) > 0); // expected-warning{{UNKNOWN}} 240281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose 241281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose if ((rhs - lhs) <= 0) { 242281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose clang_analyzer_eval(lhs == rhs); // expected-warning{{TRUE}} 243281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose return; 244281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose } 245281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose 246281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose clang_analyzer_eval(lhs == rhs); // expected-warning{{FALSE}} 247281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose clang_analyzer_eval(lhs < rhs); // expected-warning{{TRUE}} 248281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose clang_analyzer_eval((rhs - lhs) > 0); // expected-warning{{TRUE}} 249281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose} 250281698935f62ac1d35ddd3533a562c1589aadc8bJordan Rose 25178114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose//------------------------------- 25278114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose// False positives 25378114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose//------------------------------- 25478114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose 25578114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rosevoid zero_implies_reversed_equal(int *lhs, int *rhs) { 25678114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose clang_analyzer_eval((rhs - lhs) == 0); // expected-warning{{UNKNOWN}} 25778114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose if ((rhs - lhs) == 0) { 25878114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose // FIXME: Should be FALSE. 25978114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose clang_analyzer_eval(rhs != lhs); // expected-warning{{UNKNOWN}} 26078114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose // FIXME: Should be TRUE. 26178114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose clang_analyzer_eval(rhs == lhs); // expected-warning{{UNKNOWN}} 26278114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose return; 26378114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose } 26478114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose clang_analyzer_eval((rhs - lhs) == 0); // expected-warning{{FALSE}} 26578114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose // FIXME: Should be FALSE. 26678114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose clang_analyzer_eval(rhs == lhs); // expected-warning{{UNKNOWN}} 26778114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose // FIXME: Should be TRUE. 26878114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose clang_analyzer_eval(rhs != lhs); // expected-warning{{UNKNOWN}} 26978114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose} 27078114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose 27178114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rosevoid canonical_equal(int *lhs, int *rhs) { 27278114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose clang_analyzer_eval(lhs == rhs); // expected-warning{{UNKNOWN}} 27378114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose if (lhs == rhs) { 27478114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose // FIXME: Should be TRUE. 27578114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose clang_analyzer_eval(rhs == lhs); // expected-warning{{UNKNOWN}} 27678114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose return; 27778114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose } 27878114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose clang_analyzer_eval(lhs == rhs); // expected-warning{{FALSE}} 27978114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose 28078114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose // FIXME: Should be FALSE. 28178114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose clang_analyzer_eval(rhs == lhs); // expected-warning{{UNKNOWN}} 28278114a58f8cf5e9b948e82448b2f0904f5b6c19eJordan Rose} 2834e9179a3d0ec612a4d540281020b200254348a6bAnna Zaks 2844e9179a3d0ec612a4d540281020b200254348a6bAnna Zaksvoid compare_element_region_and_base(int *p) { 2854e9179a3d0ec612a4d540281020b200254348a6bAnna Zaks int *q = p - 1; 2864e9179a3d0ec612a4d540281020b200254348a6bAnna Zaks clang_analyzer_eval(p == q); // expected-warning{{FALSE}} 2874e9179a3d0ec612a4d540281020b200254348a6bAnna Zaks} 2884e9179a3d0ec612a4d540281020b200254348a6bAnna Zaks 2894e9179a3d0ec612a4d540281020b200254348a6bAnna Zaksstruct Point { 2904e9179a3d0ec612a4d540281020b200254348a6bAnna Zaks int x; 2914e9179a3d0ec612a4d540281020b200254348a6bAnna Zaks int y; 2924e9179a3d0ec612a4d540281020b200254348a6bAnna Zaks}; 2934e9179a3d0ec612a4d540281020b200254348a6bAnna Zaksvoid symbolicFieldRegion(struct Point *points, int i, int j) { 2944e9179a3d0ec612a4d540281020b200254348a6bAnna Zaks clang_analyzer_eval(&points[i].x == &points[j].x);// expected-warning{{UNKNOWN}} 2954e9179a3d0ec612a4d540281020b200254348a6bAnna Zaks clang_analyzer_eval(&points[i].x == &points[i].y);// expected-warning{{FALSE}} 2964e9179a3d0ec612a4d540281020b200254348a6bAnna Zaks clang_analyzer_eval(&points[i].x < &points[i].y);// expected-warning{{TRUE}} 2974e9179a3d0ec612a4d540281020b200254348a6bAnna Zaks} 2984e9179a3d0ec612a4d540281020b200254348a6bAnna Zaks 299