aboutsummaryrefslogtreecommitdiff
path: root/test/Analysis/range_casts.c
blob: a01ab5d520975053ed95ad37cbdad830f021d2e1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
// 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.
// RUN: %clang_analyze_cc1 -triple x86_64-pc-linux-gnu -analyzer-checker=core,debug.ExprInspection -analyzer-store=region -verify %s

void clang_analyzer_warnIfReached();

void f1(long foo)
{
  unsigned index = -1;
  if (index < foo) index = foo;
  if (index + 1 == 0) // because of foo range, index is in range [0; UINT_MAX]
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
  else
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
}

void f2(unsigned long foo)
{
  int index = -1;
  if (index < foo) index = foo; // index equals ULONG_MAX
  if (index + 1 == 0)
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
  else
    clang_analyzer_warnIfReached(); // no-warning
}

void f3(unsigned long foo)
{
  unsigned index = -1;
  if (index < foo) index = foo;
  if (index + 1 == 0)
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
  else
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
}

void f4(long foo)
{
  int index = -1;
  if (index < foo) index = foo;
  if (index + 1 == 0)
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
  else
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
}

void f5(long foo)
{
  unsigned index = -1;
  if (index < foo) index = foo;
  if (index == -1)
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
  else
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
}

void f6(long foo)
{
  unsigned index = -1;
  if (index < foo) index = foo;
  if (index == -1)
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
  else
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
}

void f7(long foo)
{
  unsigned index = -1;
  if (index < foo) index = foo;
  if (index - 1 == 0) // Was not reached prior fix.
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
  else
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
}

void f8(long foo)
{
  unsigned index = -1;
  if (index < foo) index = foo;
  if (index + 1L == 0L)
    clang_analyzer_warnIfReached(); // no-warning
  else
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
}

void f9(long foo)
{
  unsigned index = -1;
  if (index < foo) index = foo;
  if (index - 1L == 0L) // Was not reached prior fix.
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
  else
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
}

void f10(long foo)
{
  unsigned index = -1;
  if (index < foo) index = foo;
  if (index + 1 == 0L)
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
  else
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
}

void f11(long foo)
{
  unsigned index = -1;
  if (index < foo) index = foo;
  if (index + 1UL == 0L)
    clang_analyzer_warnIfReached(); // no-warning
  else
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
}

void f12(long foo)
{
  unsigned index = -1;
  if (index < foo) index = foo;
  if (index - 1UL == 0L) // Was not reached prior fix.
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
  else
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
}

void f13(int foo)
{
  unsigned short index = -1;
  if (index < foo) index = foo;
  if (index + 1 == 0)
    clang_analyzer_warnIfReached(); // no-warning
  else
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
}

void f14(long foo)
{
  unsigned index = -1;
  if (index < foo) index = foo;
  long bar = foo;
  if (index + 1 == 0)
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
  else
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
}

void f15(long foo)
{
  unsigned index = -1;
  if (index < foo) index = foo;
  unsigned int tmp = index + 1;
  if (tmp == 0)
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
  else
    clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
}