1526e627d2bd7e8cbf630526d315c90864898d9ffRichard Trieu// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -verify -analyzer-constraints=range -Wno-tautological-compare %s 243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose 343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rosevoid clang_analyzer_eval(bool); 443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose 59e607dd1dff375b4fa33d923ed592dad3ad43d42Jordy Rose#define UINT_MAX (~0U) 61d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose#define INT_MAX (UINT_MAX & (UINT_MAX >> 1)) 71d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose#define INT_MIN (-INT_MAX - 1) 8ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 9ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose//--------------- 10ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// Plus/minus 11ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose//--------------- 12ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 13ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid separateExpressions (int a) { 14ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose int b = a + 1; 15ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose --b; 16ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 1743d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a != 0 && b == 0); // expected-warning{{FALSE}} 18ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 19ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 20ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid oneLongExpression (int a) { 21ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose // Expression canonicalization should still allow this to work, even though 22ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose // the first term is on the left. 23ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose int b = 15 + a + 15 - 10 - 20; 24ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 2543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a != 0 && b == 0); // expected-warning{{FALSE}} 26ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 27ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 28b4954a4175b36d912bdfc43834d09754faddd855Jordy Rosevoid mixedTypes (int a) { 29b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose // Different additive types should not cause crashes when constant-folding. 30b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose // This is part of PR7406. 31b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose int b = a + 1LL; 3243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a != 0 && (b-1) == 0); // not crash, expected-warning{{FALSE}} 33b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose 34b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose int c = a + 1U; 3543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a != 0 && (c-1) == 0); // not crash, expected-warning{{FALSE}} 36b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose} 37b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose 38ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose//--------------- 39ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// Comparisons 40ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose//--------------- 41ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 42ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// Equality and inequality only 43ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid eq_ne (unsigned a) { 4443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose if (a == UINT_MAX) { 4543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a+1 == 0); // expected-warning{{TRUE}} 4643d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a-1 == UINT_MAX-1); // expected-warning{{TRUE}} 4743d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose } else { 4843d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a+1 != 0); // expected-warning{{TRUE}} 4943d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a-1 != UINT_MAX-1); // expected-warning{{TRUE}} 5043d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose } 51ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 52ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 53b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose// Mixed typed inequalities (part of PR7406) 54b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose// These should not crash. 55b4954a4175b36d912bdfc43834d09754faddd855Jordy Rosevoid mixed_eq_ne (int a) { 5643d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose if (a == 1) { 5743d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a+1U == 2); // expected-warning{{TRUE}} 5843d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a-1U == 0); // expected-warning{{TRUE}} 5943d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose } else { 6043d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a+1U != 2); // expected-warning{{TRUE}} 6143d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a-1U != 0); // expected-warning{{TRUE}} 6243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose } 63b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose} 64b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose 65ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 66ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// Simple order comparisons with no adjustment 67ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid baselineGT (unsigned a) { 68ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a > 0) 6943d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a != 0); // expected-warning{{TRUE}} 7043d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose else 7143d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a == 0); // expected-warning{{TRUE}} 72ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 73ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 74ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid baselineGE (unsigned a) { 75ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a >= UINT_MAX) 7643d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a == UINT_MAX); // expected-warning{{TRUE}} 7743d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose else 7843d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a != UINT_MAX); // expected-warning{{TRUE}} 79ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 80ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 81ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid baselineLT (unsigned a) { 82ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a < UINT_MAX) 8343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a != UINT_MAX); // expected-warning{{TRUE}} 8443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose else 8543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a == UINT_MAX); // expected-warning{{TRUE}} 86ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 87ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 88ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid baselineLE (unsigned a) { 89ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a <= 0) 9043d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a == 0); // expected-warning{{TRUE}} 9143d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose else 9243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a != 0); // expected-warning{{TRUE}} 93ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 94ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 95ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 96ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// Adjustment gives each of these an extra solution! 97ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid adjustedGT (unsigned a) { 9843d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a-1 > UINT_MAX-1); // expected-warning{{UNKNOWN}} 99ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 100ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 101ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid adjustedGE (unsigned a) { 10243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a-1 > UINT_MAX-1); // expected-warning{{UNKNOWN}} 10343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose 104ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a-1 >= UINT_MAX-1) 10543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a == UINT_MAX); // expected-warning{{UNKNOWN}} 106ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 107ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 108ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid adjustedLT (unsigned a) { 10943d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a+1 < 1); // expected-warning{{UNKNOWN}} 110ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 111ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 112ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid adjustedLE (unsigned a) { 11343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a+1 <= 1); // expected-warning{{UNKNOWN}} 11443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose 115ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a+1 <= 1) 11643d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a == 0); // expected-warning{{UNKNOWN}} 117ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 118ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 119ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 120ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// Tautologies 12143d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose// The negative forms are exercised as well 12243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose// because clang_analyzer_eval tests both possibilities. 12343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rosevoid tautologies(unsigned a) { 12443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a <= UINT_MAX); // expected-warning{{TRUE}} 12543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a >= 0); // expected-warning{{TRUE}} 126ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 12714d20b1dff6370f76279fcfb0fd780e2e5eb57bbJordy Rose 12814d20b1dff6370f76279fcfb0fd780e2e5eb57bbJordy Rose 1291d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose// Tautologies from outside the range of the symbol 13043d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rosevoid tautologiesOutside(unsigned char a) { 131526e627d2bd7e8cbf630526d315c90864898d9ffRichard Trieu clang_analyzer_eval(a <= 0x100); // expected-warning{{TRUE}} 132526e627d2bd7e8cbf630526d315c90864898d9ffRichard Trieu clang_analyzer_eval(a < 0x100); // expected-warning{{TRUE}} 1331d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose 134526e627d2bd7e8cbf630526d315c90864898d9ffRichard Trieu clang_analyzer_eval(a != 0x100); // expected-warning{{TRUE}} 13543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a != -1); // expected-warning{{TRUE}} 1361d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose 13743d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a > -1); // expected-warning{{TRUE}} 13843d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a >= -1); // expected-warning{{TRUE}} 1391d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose} 1401d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose 1411d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose 1421d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose// Wraparound with mixed types. Note that the analyzer assumes 1431d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose// -fwrapv semantics. 1441d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rosevoid mixedWraparoundSanityCheck(int a) { 1451d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose int max = INT_MAX; 1461d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose int min = INT_MIN; 1471d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose 1481d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose int b = a + 1; 14943d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a == max && b != min); // expected-warning{{FALSE}} 1501d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose} 1511d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose 15243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rosevoid mixedWraparoundLE_GT(int a) { 1531d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose int max = INT_MAX; 1541d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose int min = INT_MIN; 1551d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose 15643d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval((a + 2) <= (max + 1LL)); // expected-warning{{TRUE}} 15743d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval((a - 2) > (min - 1LL)); // expected-warning{{TRUE}} 15843d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval((a + 2LL) <= max); // expected-warning{{UNKNOWN}} 1591d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose} 1601d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose 16143d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rosevoid mixedWraparoundGE_LT(int a) { 1621d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose int max = INT_MAX; 1631d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose int min = INT_MIN; 1641d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose 16543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval((a + 2) < (max + 1LL)); // expected-warning{{TRUE}} 16643d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval((a - 2) >= (min - 1LL)); // expected-warning{{TRUE}} 16743d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval((a - 2LL) >= min); // expected-warning{{UNKNOWN}} 1681d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose} 1691d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose 17043d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rosevoid mixedWraparoundEQ_NE(int a) { 1711d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose int max = INT_MAX; 1721d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose 17343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval((a + 2) != (max + 1LL)); // expected-warning{{TRUE}} 17443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval((a + 2LL) == (max + 1LL)); // expected-warning{{UNKNOWN}} 1751d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose} 1761d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose 1771d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose 1781d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose// Mixed-signedness comparisons. 1791d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rosevoid mixedSignedness(int a, unsigned b) { 1801d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose int sMin = INT_MIN; 1811d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose unsigned uMin = INT_MIN; 18243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose 18343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(a == sMin && a != uMin); // expected-warning{{FALSE}} 18443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(b == uMin && b != sMin); // expected-warning{{FALSE}} 1851d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose} 1861d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose 1874708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rosevoid mixedSignedness2(int a) { 1884708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rose if (a != -1) 1894708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rose return; 1904708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rose clang_analyzer_eval(a == UINT_MAX); // expected-warning{{TRUE}} 1914708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rose} 1924708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rose 1934708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rosevoid mixedSignedness3(unsigned a) { 1944708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rose if (a != UINT_MAX) 1954708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rose return; 1964708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rose clang_analyzer_eval(a == -1); // expected-warning{{TRUE}} 1974708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rose} 1984708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rose 1991d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose 2001d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rosevoid multiplicativeSanityTest(int x) { 2011d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose // At one point we were ignoring the *4 completely -- the constraint manager 20243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose // would see x < 8 and then declare the assertion to be known false. 2031d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose if (x*4 < 8) 2041d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose return; 20543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose 20643d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose clang_analyzer_eval(x == 3); // expected-warning{{UNKNOWN}} 2071d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose} 208