additive-folding.cpp revision b4954a4175b36d912bdfc43834d09754faddd855
1ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-experimental-checks -verify -analyzer-constraints=basic %s
2ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-experimental-checks -verify -analyzer-constraints=range %s
3ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose#include <limits.h>
4ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
5ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// These are used to trigger warnings.
6ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosetypedef typeof(sizeof(int)) size_t;
7ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid *malloc(size_t);
8ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid free(void *);
9ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose#define NULL ((void*)0)
10ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
11ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose//---------------
12ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose//  Plus/minus
13ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose//---------------
14ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
15ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid separateExpressions (int a) {
16ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  int b = a + 1;
17ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  --b;
18ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
19ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  char* buf = malloc(1);
20ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a != 0 && b == 0)
21ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    return; // no-warning
22ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  free(buf);
23ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
24ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
25ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid oneLongExpression (int a) {
26ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  // Expression canonicalization should still allow this to work, even though
27ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  // the first term is on the left.
28ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  int b = 15 + a + 15 - 10 - 20;
29ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
30ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  char* buf = malloc(1);
31ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a != 0 && b == 0)
32ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    return; // no-warning
33ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  free(buf);
34ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
35ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
36b4954a4175b36d912bdfc43834d09754faddd855Jordy Rosevoid mixedTypes (int a) {
37b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose  char* buf = malloc(1);
38b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose
39b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose  // Different additive types should not cause crashes when constant-folding.
40b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose  // This is part of PR7406.
41b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose  int b = a + 1LL;
42b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose  if (a != 0 && (b-1) == 0) // not crash
43b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose    return; // no warning
44b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose
45b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose  int c = a + 1U;
46b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose  if (a != 0 && (c-1) == 0) // not crash
47b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose    return; // no warning
48b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose
49b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose  free(buf);
50b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose}
51b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose
52ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose//---------------
53ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose//  Comparisons
54ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose//---------------
55ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
56ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// Equality and inequality only
57ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid eq_ne (unsigned a) {
58ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  char* b = NULL;
59ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a == UINT_MAX)
60ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    b = malloc(1);
61ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a+1 != 0)
62ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    return; // no-warning
63ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a-1 != UINT_MAX-1)
64ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    return; // no-warning
65ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  free(b);
66ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
67ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
68ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid ne_eq (unsigned a) {
69ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  char* b = NULL;
70ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a != UINT_MAX)
71ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    b = malloc(1);
72ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a+1 == 0)
73ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    return; // no-warning
74ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a-1 == UINT_MAX-1)
75ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    return; // no-warning
76ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  free(b);
77ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
78ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
79b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose// Mixed typed inequalities (part of PR7406)
80b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose// These should not crash.
81b4954a4175b36d912bdfc43834d09754faddd855Jordy Rosevoid mixed_eq_ne (int a) {
82b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose  char* b = NULL;
83b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose  if (a == 1)
84b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose    b = malloc(1);
85b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose  if (a+1U != 2)
86b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose    return; // no-warning
87b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose  if (a-1U != 0)
88b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose    return; // no-warning
89b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose  free(b);
90b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose}
91b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose
92b4954a4175b36d912bdfc43834d09754faddd855Jordy Rosevoid mixed_ne_eq (int a) {
93b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose  char* b = NULL;
94b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose  if (a != 1)
95b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose    b = malloc(1);
96b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose  if (a+1U == 2)
97b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose    return; // no-warning
98b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose  if (a-1U == 0)
99b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose    return; // no-warning
100b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose  free(b);
101b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose}
102b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose
103ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
104ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// Simple order comparisons with no adjustment
105ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid baselineGT (unsigned a) {
106ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  char* b = NULL;
107ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a > 0)
108ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    b = malloc(1);
109ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a == 0)
110ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    return; // no-warning
111ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  free(b);
112ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
113ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
114ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid baselineGE (unsigned a) {
115ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  char* b = NULL;
116ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a >= UINT_MAX)
117ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    b = malloc(1);
118ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a == UINT_MAX)
119ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    free(b);
120ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  return; // no-warning
121ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
122ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
123ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid baselineLT (unsigned a) {
124ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  char* b = NULL;
125ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a < UINT_MAX)
126ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    b = malloc(1);
127ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a == UINT_MAX)
128ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    return; // no-warning
129ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  free(b);
130ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
131ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
132ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid baselineLE (unsigned a) {
133ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  char* b = NULL;
134ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a <= 0)
135ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    b = malloc(1);
136ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a == 0)
137ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    free(b);
138ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  return; // no-warning
139ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
140ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
141ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
142ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// Adjustment gives each of these an extra solution!
143ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid adjustedGT (unsigned a) {
144ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  char* b = NULL;
145ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a-1 > UINT_MAX-1)
146ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    b = malloc(1);
147ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  return; // expected-warning{{leak}}
148ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
149ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
150ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid adjustedGE (unsigned a) {
151ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  char* b = NULL;
152ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a-1 >= UINT_MAX-1)
153ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    b = malloc(1);
154ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a == UINT_MAX)
155ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    free(b);
156ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  return; // expected-warning{{leak}}
157ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
158ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
159ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid adjustedLT (unsigned a) {
160ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  char* b = NULL;
161ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a+1 < 1)
162ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    b = malloc(1);
163ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  return; // expected-warning{{leak}}
164ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
165ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
166ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid adjustedLE (unsigned a) {
167ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  char* b = NULL;
168ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a+1 <= 1)
169ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    b = malloc(1);
170ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a == 0)
171ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    free(b);
172ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  return; // expected-warning{{leak}}
173ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
174ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
175ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
176ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// Tautologies
177ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid tautologyGT (unsigned a) {
178ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  char* b = malloc(1);
179ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a > UINT_MAX)
180ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    return; // no-warning
181ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  free(b);
182ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
183ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
184ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid tautologyGE (unsigned a) {
185ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  char* b = malloc(1);
186ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a >= 0)
187ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    free(b);
188ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  return; // no-warning
189ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
190ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
191ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid tautologyLT (unsigned a) {
192ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  char* b = malloc(1);
193ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a < 0)
194ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    return; // no-warning
195ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  free(b);
196ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
197ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
198ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid tautologyLE (unsigned a) {
199ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  char* b = malloc(1);
200ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a <= UINT_MAX)
201ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose    free(b);
202ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  return; // no-warning
203ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
204