blob: 14fd42a2bf7cb933acb677f5c5a21808d938f237 [file] [log] [blame]
Jordy Roseba0f61c2010-06-18 22:49:11 +00001// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-experimental-checks -verify -analyzer-constraints=basic %s
2// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-experimental-checks -verify -analyzer-constraints=range %s
3#include <limits.h>
4
5// These are used to trigger warnings.
6typedef typeof(sizeof(int)) size_t;
7void *malloc(size_t);
8void free(void *);
9#define NULL ((void*)0)
10
11//---------------
12// Plus/minus
13//---------------
14
15void separateExpressions (int a) {
16 int b = a + 1;
17 --b;
18
19 char* buf = malloc(1);
20 if (a != 0 && b == 0)
21 return; // no-warning
22 free(buf);
23}
24
25void oneLongExpression (int a) {
26 // Expression canonicalization should still allow this to work, even though
27 // the first term is on the left.
28 int b = 15 + a + 15 - 10 - 20;
29
30 char* buf = malloc(1);
31 if (a != 0 && b == 0)
32 return; // no-warning
33 free(buf);
34}
35
36//---------------
37// Comparisons
38//---------------
39
40// Equality and inequality only
41void eq_ne (unsigned a) {
42 char* b = NULL;
43 if (a == UINT_MAX)
44 b = malloc(1);
45 if (a+1 != 0)
46 return; // no-warning
47 if (a-1 != UINT_MAX-1)
48 return; // no-warning
49 free(b);
50}
51
52void ne_eq (unsigned a) {
53 char* b = NULL;
54 if (a != UINT_MAX)
55 b = malloc(1);
56 if (a+1 == 0)
57 return; // no-warning
58 if (a-1 == UINT_MAX-1)
59 return; // no-warning
60 free(b);
61}
62
63
64// Simple order comparisons with no adjustment
65void baselineGT (unsigned a) {
66 char* b = NULL;
67 if (a > 0)
68 b = malloc(1);
69 if (a == 0)
70 return; // no-warning
71 free(b);
72}
73
74void baselineGE (unsigned a) {
75 char* b = NULL;
76 if (a >= UINT_MAX)
77 b = malloc(1);
78 if (a == UINT_MAX)
79 free(b);
80 return; // no-warning
81}
82
83void baselineLT (unsigned a) {
84 char* b = NULL;
85 if (a < UINT_MAX)
86 b = malloc(1);
87 if (a == UINT_MAX)
88 return; // no-warning
89 free(b);
90}
91
92void baselineLE (unsigned a) {
93 char* b = NULL;
94 if (a <= 0)
95 b = malloc(1);
96 if (a == 0)
97 free(b);
98 return; // no-warning
99}
100
101
102// Adjustment gives each of these an extra solution!
103void adjustedGT (unsigned a) {
104 char* b = NULL;
105 if (a-1 > UINT_MAX-1)
106 b = malloc(1);
107 return; // expected-warning{{leak}}
108}
109
110void adjustedGE (unsigned a) {
111 char* b = NULL;
112 if (a-1 >= UINT_MAX-1)
113 b = malloc(1);
114 if (a == UINT_MAX)
115 free(b);
116 return; // expected-warning{{leak}}
117}
118
119void adjustedLT (unsigned a) {
120 char* b = NULL;
121 if (a+1 < 1)
122 b = malloc(1);
123 return; // expected-warning{{leak}}
124}
125
126void adjustedLE (unsigned a) {
127 char* b = NULL;
128 if (a+1 <= 1)
129 b = malloc(1);
130 if (a == 0)
131 free(b);
132 return; // expected-warning{{leak}}
133}
134
135
136// Tautologies
137void tautologyGT (unsigned a) {
138 char* b = malloc(1);
139 if (a > UINT_MAX)
140 return; // no-warning
141 free(b);
142}
143
144void tautologyGE (unsigned a) {
145 char* b = malloc(1);
146 if (a >= 0)
147 free(b);
148 return; // no-warning
149}
150
151void tautologyLT (unsigned a) {
152 char* b = malloc(1);
153 if (a < 0)
154 return; // no-warning
155 free(b);
156}
157
158void tautologyLE (unsigned a) {
159 char* b = malloc(1);
160 if (a <= UINT_MAX)
161 free(b);
162 return; // no-warning
163}