blob: 2369c09d22f1c4e490fa2b6bb58cdb3098a6c66f [file] [log] [blame]
Anna Zaks2b687612013-02-07 23:05:37 +00001// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-checker=core,debug.ExprInspection -verify %s
2
3void clang_analyzer_eval(int);
4
Jordan Rose262e0d42013-04-15 20:39:45 +00005#include "Inputs/system-header-simulator.h"
6
Anna Zaks2b687612013-02-07 23:05:37 +00007void use(int);
8id foo(int x) {
9 if (x)
10 return 0;
11 static id p = foo(1);
12 clang_analyzer_eval(p == 0); // expected-warning{{TRUE}}
13 return p;
Jordan Rosefbdbed32013-02-25 19:45:34 +000014}
15
Jordan Rosef8e2c062013-03-20 20:36:01 +000016const int &globalIntRef = 42;
Jordan Rosefbdbed32013-02-25 19:45:34 +000017
Jordan Rosef8e2c062013-03-20 20:36:01 +000018void testGlobalRef() {
Jordan Rosefbdbed32013-02-25 19:45:34 +000019 // FIXME: Should be TRUE, but should at least not crash.
Jordan Rosef8e2c062013-03-20 20:36:01 +000020 clang_analyzer_eval(globalIntRef == 42); // expected-warning{{UNKNOWN}}
21}
22
23extern int globalInt;
Jordan Rose262e0d42013-04-15 20:39:45 +000024struct IntWrapper {
Jordan Rosee0208ff2013-04-15 20:39:41 +000025 int value;
Jordan Rose262e0d42013-04-15 20:39:45 +000026};
27extern struct IntWrapper globalStruct;
Jordan Rosef8e2c062013-03-20 20:36:01 +000028extern void invalidateGlobals();
29
30void testGlobalInvalidation() {
Jordan Rosee0208ff2013-04-15 20:39:41 +000031 clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
32 clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
33
Jordan Rosef8e2c062013-03-20 20:36:01 +000034 if (globalInt != 42)
35 return;
Jordan Rosee0208ff2013-04-15 20:39:41 +000036 if (globalStruct.value != 43)
37 return;
Jordan Rosef8e2c062013-03-20 20:36:01 +000038 clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}}
Jordan Rosee0208ff2013-04-15 20:39:41 +000039 clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}}
Jordan Rosef8e2c062013-03-20 20:36:01 +000040
41 invalidateGlobals();
Jordan Rosefbdbed32013-02-25 19:45:34 +000042 clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
Jordan Rosee0208ff2013-04-15 20:39:41 +000043 clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
Jordan Rose262e0d42013-04-15 20:39:45 +000044
45 // Repeat to make sure we don't get the /same/ new symbolic values.
46 if (globalInt != 42)
47 return;
48 if (globalStruct.value != 43)
49 return;
50 clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}}
51 clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}}
52
53 invalidateGlobals();
54 clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
55 clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
Jordan Rosefbdbed32013-02-25 19:45:34 +000056}
Jordan Rosef8e2c062013-03-20 20:36:01 +000057
Jordan Rosef8e2c062013-03-20 20:36:01 +000058void testGlobalInvalidationWithDirectBinding() {
Jordan Rosee0208ff2013-04-15 20:39:41 +000059 clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
60 clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
61
Jordan Rosef8e2c062013-03-20 20:36:01 +000062 globalInt = 42;
Jordan Rosee0208ff2013-04-15 20:39:41 +000063 globalStruct.value = 43;
Jordan Rosef8e2c062013-03-20 20:36:01 +000064 clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}}
Jordan Rosee0208ff2013-04-15 20:39:41 +000065 clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}}
Jordan Rosef8e2c062013-03-20 20:36:01 +000066
67 invalidateGlobals();
Jordan Rosee0208ff2013-04-15 20:39:41 +000068 clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
69 clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
Jordan Rosef8e2c062013-03-20 20:36:01 +000070}
Jordan Rose262e0d42013-04-15 20:39:45 +000071
72void testStaticLocals(void) {
73 static int i;
74 int tmp;
75
76 extern int someSymbolicValue();
77 i = someSymbolicValue();
78
79 if (i == 5) {
80 clang_analyzer_eval(i == 5); // expected-warning{{TRUE}}
81 scanf("%d", &tmp);
82 clang_analyzer_eval(i == 5); // expected-warning{{TRUE}}
83 invalidateGlobals();
84 clang_analyzer_eval(i == 5); // expected-warning{{TRUE}}
85 }
86
87 i = 6;
88 clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}
89 scanf("%d", &tmp);
90 clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}
91 invalidateGlobals();
92 clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}
93
94 i = someSymbolicValue();
95 if (i == 7) {
96 clang_analyzer_eval(i == 7); // expected-warning{{TRUE}}
97 scanf("%d", &i);
98 clang_analyzer_eval(i == 7); // expected-warning{{UNKNOWN}}
99 }
100
101 i = 8;
102 clang_analyzer_eval(i == 8); // expected-warning{{TRUE}}
103 scanf("%d", &i);
104 clang_analyzer_eval(i == 8); // expected-warning{{UNKNOWN}}
105}
106
107void testNonSystemGlobals(void) {
108 extern int i;
109 int tmp;
110
111 if (i == 5) {
112 clang_analyzer_eval(i == 5); // expected-warning{{TRUE}}
113 scanf("%d", &tmp);
114 clang_analyzer_eval(i == 5); // expected-warning{{TRUE}}
115 invalidateGlobals();
116 clang_analyzer_eval(i == 5); // expected-warning{{UNKNOWN}}
117 }
118
119 i = 6;
120 clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}
121 scanf("%d", &tmp);
122 clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}
123 invalidateGlobals();
124 clang_analyzer_eval(i == 6); // expected-warning{{UNKNOWN}}
125
126 if (i == 7) {
127 clang_analyzer_eval(i == 7); // expected-warning{{TRUE}}
128 scanf("%d", &i);
129 clang_analyzer_eval(i == 7); // expected-warning{{UNKNOWN}}
130 }
131
132 i = 8;
133 clang_analyzer_eval(i == 8); // expected-warning{{TRUE}}
134 scanf("%d", &i);
135 clang_analyzer_eval(i == 8); // expected-warning{{UNKNOWN}}
136}
137
138void testWrappedGlobals(void) {
139 extern char c;
140 SomeStruct s;
141
142 if (c == 'C') {
143 s.p = &c;
144 clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}}
145 fakeSystemHeaderCall(0);
146 clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}}
147 fakeSystemHeaderCall(&s);
148 clang_analyzer_eval(c == 'C'); // expected-warning{{UNKNOWN}}
149 }
150
151 c = 'c';
152 s.p = &c;
153 clang_analyzer_eval(c == 'c'); // expected-warning{{TRUE}}
154 fakeSystemHeaderCall(0);
155 clang_analyzer_eval(c == 'c'); // expected-warning{{TRUE}}
156 fakeSystemHeaderCall(&s);
157 clang_analyzer_eval(c == 'c'); // expected-warning{{UNKNOWN}}
158
159 if (c == 'C') {
160 s.p = &c;
161 clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}}
162 fakeSystemHeaderCall(0);
163 clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}}
164 fakeSystemHeaderCall(&s);
165 clang_analyzer_eval(c == 'C'); // expected-warning{{UNKNOWN}}
166 }
167}
168
169void testWrappedStaticsViaGlobal(void) {
170 static char c;
171 extern SomeStruct s;
172
173 extern char getSomeChar();
174 c = getSomeChar();
175
176 if (c == 'C') {
177 s.p = &c;
178 clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}}
179 invalidateGlobals();
180 clang_analyzer_eval(c == 'C'); // expected-warning{{UNKNOWN}}
181 }
182
183 c = 'c';
184 s.p = &c;
185 clang_analyzer_eval(c == 'c'); // expected-warning{{TRUE}}
186 invalidateGlobals();
187 clang_analyzer_eval(c == 'c'); // expected-warning{{UNKNOWN}}
188}