166 lines · c
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_analyze_cc1 -triple x86_64-pc-linux-gnu -analyzer-checker=core,debug.ExprInspection -verify %s3 4void clang_analyzer_warnIfReached(void);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 else13 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_MAX20 if (index + 1 == 0)21 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}22 else23 clang_analyzer_warnIfReached(); // no-warning24}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 else33 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 else43 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 else53 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 else63 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 else73 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-warning82 else83 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 else93 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 else103 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-warning112 else113 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 else123 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-warning132 else133 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 else144 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 else155 clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}156}157 158int *getIntPtr(void) {159 extern int *intPtr;160 return intPtr;161}162char call_malformed_fptr() {163 int (*fptr)(void) = (int (*)(void))getIntPtr;164 return fptr(); // no-crash165}166