blob: 51c8aae66c1ec7f79f7722e6977215bb72382649 [file] [log] [blame]
Ted Kremenek565e4652010-02-05 02:06:54 +00001// RUN: %clang_cc1 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -analyzer-store=region -analyzer-constraints=range -verify %s
Zhongxing Xuf45fbad2010-12-19 02:26:37 +00002
Jordy Rose5d553762010-06-04 01:14:56 +00003typedef typeof(sizeof(int)) size_t;
4void malloc (size_t);
Zhongxing Xubc37b8d2010-01-09 09:16:47 +00005
6void f1() {
Ted Kremenek892697d2010-12-16 07:46:53 +00007 int const &i = 3; // <--- **FIXME** This is currently not being modeled correctly.
Zhongxing Xubc37b8d2010-01-09 09:16:47 +00008 int b = i;
Zhongxing Xu3cd8bd42010-01-10 02:52:56 +00009
10 int *p = 0;
11
12 if (b != 3)
13 *p = 1; // no-warning
Zhongxing Xubc37b8d2010-01-09 09:16:47 +000014}
Zhongxing Xufc61d942010-06-03 06:23:18 +000015
16char* ptr();
17char& ref();
18
19// These next two tests just shouldn't crash.
20char t1 () {
21 ref() = 'c';
22 return '0';
23}
24
25// just a sanity test, the same behavior as t1()
26char t2 () {
27 *ptr() = 'c';
28 return '0';
29}
Jordy Rose5d553762010-06-04 01:14:56 +000030
31// Each of the tests below is repeated with pointers as well as references.
32// This is mostly a sanity check, but then again, both should work!
33char t3 () {
34 char& r = ref();
35 r = 'c'; // no-warning
36 if (r) return r;
37 return *(char*)0; // no-warning
38}
39
40char t4 () {
41 char* p = ptr();
42 *p = 'c'; // no-warning
43 if (*p) return *p;
44 return *(char*)0; // no-warning
45}
46
47char t5 (char& r) {
48 r = 'c'; // no-warning
49 if (r) return r;
50 return *(char*)0; // no-warning
51}
52
53char t6 (char* p) {
54 *p = 'c'; // no-warning
55 if (*p) return *p;
56 return *(char*)0; // no-warning
57}