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 4 void clang_analyzer_warnIfReached(); 5 f1(long foo)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 f2(unsigned long foo)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 f3(unsigned long foo)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 f4(long foo)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 f5(long foo)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 f6(long foo)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 f7(long foo)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 f8(long foo)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 f9(long foo)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 f10(long foo)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 f11(long foo)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 f12(long foo)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 f13(int foo)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 f14(long foo)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 f15(long foo)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