1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// 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 -Wno-tautological-pointer-compare %s
2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// 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 -Wno-tautological-pointer-compare %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