1// This test checks that intersecting ranges does not cause 'system is over constrained' assertions in the case of eg: 32 bits unsigned integers getting their range from 64 bits signed integers. 2// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-store=region -verify %s 3 4void clang_analyzer_warnIfReached(); 5 6void f1(long foo) 7{ 8 unsigned index = -1; 9 if (index < foo) index = foo; 10 if (index + 1 == 0) // because of foo range, index is in range [0; UINT_MAX] 11 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 12 else 13 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 14} 15 16void f2(unsigned long foo) 17{ 18 int index = -1; 19 if (index < foo) index = foo; // index equals ULONG_MAX 20 if (index + 1 == 0) 21 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 22 else 23 clang_analyzer_warnIfReached(); // no-warning 24} 25 26void f3(unsigned long foo) 27{ 28 unsigned index = -1; 29 if (index < foo) index = foo; 30 if (index + 1 == 0) 31 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 32 else 33 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 34} 35 36void f4(long foo) 37{ 38 int index = -1; 39 if (index < foo) index = foo; 40 if (index + 1 == 0) 41 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 42 else 43 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 44} 45 46void f5(long foo) 47{ 48 unsigned index = -1; 49 if (index < foo) index = foo; 50 if (index == -1) 51 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 52 else 53 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 54} 55 56void f6(long foo) 57{ 58 unsigned index = -1; 59 if (index < foo) index = foo; 60 if (index == -1) 61 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 62 else 63 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 64} 65 66void f7(long foo) 67{ 68 unsigned index = -1; 69 if (index < foo) index = foo; 70 if (index - 1 == 0) // Was not reached prior fix. 71 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 72 else 73 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 74} 75 76void f8(long foo) 77{ 78 unsigned index = -1; 79 if (index < foo) index = foo; 80 if (index + 1L == 0L) 81 clang_analyzer_warnIfReached(); // no-warning 82 else 83 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 84} 85 86void f9(long foo) 87{ 88 unsigned index = -1; 89 if (index < foo) index = foo; 90 if (index - 1L == 0L) // Was not reached prior fix. 91 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 92 else 93 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 94} 95 96void f10(long foo) 97{ 98 unsigned index = -1; 99 if (index < foo) index = foo; 100 if (index + 1 == 0L) 101 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 102 else 103 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 104} 105 106void f11(long foo) 107{ 108 unsigned index = -1; 109 if (index < foo) index = foo; 110 if (index + 1UL == 0L) 111 clang_analyzer_warnIfReached(); // no-warning 112 else 113 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 114} 115 116void f12(long foo) 117{ 118 unsigned index = -1; 119 if (index < foo) index = foo; 120 if (index - 1UL == 0L) // Was not reached prior fix. 121 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 122 else 123 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 124} 125 126void f13(int foo) 127{ 128 unsigned short index = -1; 129 if (index < foo) index = foo; 130 if (index + 1 == 0) 131 clang_analyzer_warnIfReached(); // no-warning 132 else 133 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 134} 135 136void f14(long foo) 137{ 138 unsigned index = -1; 139 if (index < foo) index = foo; 140 long bar = foo; 141 if (index + 1 == 0) 142 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 143 else 144 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 145} 146 147void f15(long foo) 148{ 149 unsigned index = -1; 150 if (index < foo) index = foo; 151 unsigned int tmp = index + 1; 152 if (tmp == 0) 153 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 154 else 155 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 156} 157