Home | History | Annotate | Download | only in Analysis
      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 
      6 void 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 
     16 void 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 
     26 void 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 
     36 void 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 
     46 void 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 
     56 void 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 
     66 void 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 
     76 void 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 
     86 void 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 
     96 void 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 
    106 void 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 
    116 void 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 
    126 void 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 
    136 void 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 
    147 void 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