1bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks// RUN: %clang_cc1 -triple i386-apple-darwin9 -analyze -analyzer-checker=core,alpha.core -analyzer-store=region -verify -fblocks -analyzer-opt-analyze-nested-blocks %s -fexceptions -fcxx-exceptions
2bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -analyze -analyzer-checker=core,alpha.core -analyzer-store=region -verify -fblocks -analyzer-opt-analyze-nested-blocks %s -fexceptions -fcxx-exceptions
3d87682ed3c3e5d748d13a5c4f1cbb267aa756b31Ted Kremenek
453287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenek// Test basic handling of references.
5d87682ed3c3e5d748d13a5c4f1cbb267aa756b31Ted Kremenekchar &test1_aux();
6d87682ed3c3e5d748d13a5c4f1cbb267aa756b31Ted Kremenekchar *test1() {
7d87682ed3c3e5d748d13a5c4f1cbb267aa756b31Ted Kremenek  return &test1_aux();
8d87682ed3c3e5d748d13a5c4f1cbb267aa756b31Ted Kremenek}
953287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenek
10910e4080986045cc2036f8d1f55398acc7fbb257Zhongxing Xu// Test test1_aux() evaluates to char &.
1153287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenekchar test1_as_rvalue() {
1253287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenek  return test1_aux();
1353287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenek}
1453287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenek
15949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek// Test passing a value as a reference.  The 'const' in test2_aux() adds
16949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek// an ImplicitCastExpr, which is evaluated as an lvalue.
17949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenekint test2_aux(const int &n);
18949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenekint test2(int n) {
19949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek  return test2_aux(n);
20949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek}
21949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek
22949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenekint test2_b_aux(const short &n);
23949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenekint test2_b(int n) {
24949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek  return test2_b_aux(n);
25949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek}
26077a40df258beb46cb746af61da115e9718a6affTed Kremenek
27077a40df258beb46cb746af61da115e9718a6affTed Kremenek// Test getting the lvalue of a derived and converting it to a base.  This
28077a40df258beb46cb746af61da115e9718a6affTed Kremenek// previously crashed.
29077a40df258beb46cb746af61da115e9718a6affTed Kremenekclass Test3_Base {};
30077a40df258beb46cb746af61da115e9718a6affTed Kremenekclass Test3_Derived : public Test3_Base {};
31077a40df258beb46cb746af61da115e9718a6affTed Kremenek
32077a40df258beb46cb746af61da115e9718a6affTed Kremenekint test3_aux(Test3_Base &x);
33077a40df258beb46cb746af61da115e9718a6affTed Kremenekint test3(Test3_Derived x) {
34077a40df258beb46cb746af61da115e9718a6affTed Kremenek  return test3_aux(x);
35077a40df258beb46cb746af61da115e9718a6affTed Kremenek}
36077a40df258beb46cb746af61da115e9718a6affTed Kremenek
37de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek//===---------------------------------------------------------------------===//
38de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek// Test CFG support for C++ condition variables.
39de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek//===---------------------------------------------------------------------===//
40de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
4161dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenekint test_init_in_condition_aux();
4261dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenekint test_init_in_condition() {
4361dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenek  if (int x = test_init_in_condition_aux()) { // no-warning
4461dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenek    return 1;
4561dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenek  }
4661dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenek  return 0;
4761dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenek}
48fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek
49fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenekint test_init_in_condition_switch() {
50fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek  switch (int x = test_init_in_condition_aux()) { // no-warning
51fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek    case 1:
52fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek      return 0;
53fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek    case 2:
54fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek      if (x == 2)
55fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek        return 0;
56fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek      else {
57fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek        // Unreachable.
58fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek        int *p = 0;
59fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek        *p = 0xDEADBEEF; // no-warning
60fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek      }
61fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek    default:
62fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek      break;
63fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek  }
64fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek  return 0;
65fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek}
664c508a12cedcf2896412a3700c1b2a35bf339828Ted Kremenek
674c508a12cedcf2896412a3700c1b2a35bf339828Ted Kremenekint test_init_in_condition_while() {
684ec010a6ccf4db2ab2ef9e68942642d50f7f193cTed Kremenek  int z = 0;
694ec010a6ccf4db2ab2ef9e68942642d50f7f193cTed Kremenek  while (int x = ++z) { // no-warning
704ec010a6ccf4db2ab2ef9e68942642d50f7f193cTed Kremenek    if (x == 2)
714c508a12cedcf2896412a3700c1b2a35bf339828Ted Kremenek      break;
724c508a12cedcf2896412a3700c1b2a35bf339828Ted Kremenek  }
734ec010a6ccf4db2ab2ef9e68942642d50f7f193cTed Kremenek
744ec010a6ccf4db2ab2ef9e68942642d50f7f193cTed Kremenek  if (z == 2)
754ec010a6ccf4db2ab2ef9e68942642d50f7f193cTed Kremenek    return 0;
764ec010a6ccf4db2ab2ef9e68942642d50f7f193cTed Kremenek
774ec010a6ccf4db2ab2ef9e68942642d50f7f193cTed Kremenek  int *p = 0;
784ec010a6ccf4db2ab2ef9e68942642d50f7f193cTed Kremenek  *p = 0xDEADBEEF; // no-warning
794c508a12cedcf2896412a3700c1b2a35bf339828Ted Kremenek  return 0;
804c508a12cedcf2896412a3700c1b2a35bf339828Ted Kremenek}
814ec010a6ccf4db2ab2ef9e68942642d50f7f193cTed Kremenek
82dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek
83dd8b44101281c894026c7070da6e826c542ea87bTed Kremenekint test_init_in_condition_for() {
84dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek  int z = 0;
85dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek  for (int x = 0; int y = ++z; ++x) {
86dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek    if (x == y) // no-warning
87dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek      break;
88dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek  }
89dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek  if (z == 1)
90dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek    return 0;
91dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek
92dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek  int *p = 0;
93dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek  *p = 0xDEADBEEF; // no-warning
94dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek  return 0;
95dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek}
96de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
97de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek//===---------------------------------------------------------------------===//
98de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek// Test handling of 'this' pointer.
99de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek//===---------------------------------------------------------------------===//
100de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
101de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekclass TestHandleThis {
102de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  int x;
103de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
104de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  TestHandleThis();
105de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  int foo();
106de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  int null_deref_negative();
107de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  int null_deref_positive();
108de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek};
109de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
110de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekint TestHandleThis::foo() {
111de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  // Assume that 'x' is initialized.
112de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  return x + 1; // no-warning
113de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
114de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
115de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekint TestHandleThis::null_deref_negative() {
116de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  x = 10;
117de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  if (x == 10) {
118de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return 1;
119de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
120de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  int *p = 0;
121de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  *p = 0xDEADBEEF; // no-warning
122de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  return 0;
123de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
124de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
125de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekint TestHandleThis::null_deref_positive() {
126de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  x = 10;
127de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  if (x == 9) {
128de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek    return 1;
129de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  }
130de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  int *p = 0;
131de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  *p = 0xDEADBEEF; // expected-warning{{null pointer}}
132de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek  return 0;
133de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}
134de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek
135741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek// PR 7675 - passing literals by-reference
136741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenekvoid pr7675(const double &a);
137741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenekvoid pr7675(const int &a);
138741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenekvoid pr7675(const char &a);
139741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenekvoid pr7675_i(const _Complex double &a);
140741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek
141741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenekvoid pr7675_test() {
142741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek  pr7675(10.0);
143741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek  pr7675(10);
144741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek  pr7675('c');
145741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek  pr7675_i(4.0i);
146741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek  // Add null deref to ensure we are analyzing the code up to this point.
147741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek  int *p = 0;
148741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek  *p = 0xDEADBEEF; // expected-warning{{null pointer}}
149741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek}
150741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek
151a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek// <rdar://problem/8375510> - CFGBuilder should handle temporaries.
152a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenekstruct R8375510 {
153a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek  R8375510();
154a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek  ~R8375510();
155a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek  R8375510 operator++(int);
156a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek};
157a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek
158a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenekint r8375510(R8375510 x, R8375510 y) {
159a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek  for (; ; x++) { }
160a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek}
161a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek
16299cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan// PR8419 -- this used to crash.
16399cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan
16499cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wanclass String8419 {
16599cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan public:
16699cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  char& get(int n);
16799cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  char& operator[](int n);
16899cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan};
16999cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan
17099cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wanchar& get8419();
17199cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan
17299cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wanvoid Test8419() {
17399cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  String8419 s;
17499cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  ++(s.get(0));
17599cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  get8419()--;  // used to crash
17699cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  --s[0];       // used to crash
17799cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  s[0] &= 1;    // used to crash
17899cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan  s[0]++;       // used to crash
17999cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan}
18099cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan
181739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan// PR8426 -- this used to crash.
182739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
183739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanvoid Use(void* to);
184739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
185739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <class T> class Foo {
186739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  ~Foo();
187739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  struct Bar;
188739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  Bar* bar_;
189739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan};
190739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
191739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <class T> Foo<T>::~Foo() {
192739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  Use(bar_);
193739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  T::DoSomething();
194739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  bar_->Work();
195739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan}
196739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
197739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan// PR8427 -- this used to crash.
198739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
199739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanclass Dummy {};
200739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
201739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanbool operator==(Dummy, int);
202739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
203739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <typename T>
204739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanclass Foo2 {
205739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  bool Bar();
206739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan};
207739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
208739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <typename T>
209739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanbool Foo2<T>::Bar() {
210739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  return 0 == T();
211739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan}
212739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
213739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan// PR8433 -- this used to crash.
214739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
215739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <typename T>
216739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanclass Foo3 {
217739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan public:
218739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  void Bar();
219739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  void Baz();
220739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  T value_;
221739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan};
222739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan
223739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <typename T>
224739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanvoid Foo3<T>::Bar() {
225739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  Baz();
226739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan  value_();
227739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan}
228b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek
229b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek//===---------------------------------------------------------------------===//
230b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek// Handle misc. C++ constructs.
231b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek//===---------------------------------------------------------------------===//
232b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek
233b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremeneknamespace fum {
234b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek  int i = 3;
235b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek};
236b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek
237b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenekvoid test_namespace() {
238b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek  // Previously triggered a crash.
239b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek  using namespace fum;
240b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek  int x = i;
241b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek}
242b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek
243b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek// Test handling methods that accept references as parameters, and that
244b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek// variables are properly invalidated.
245b277159055933e610bbc80262b600d3ad7e0595cTed Kremenekclass RDar9203355 {
246b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  bool foo(unsigned valA, long long &result) const;
247b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  bool foo(unsigned valA, int &result) const;
248b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek};
249b277159055933e610bbc80262b600d3ad7e0595cTed Kremenekbool RDar9203355::foo(unsigned valA, int &result) const {
250b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  long long val;
251b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  if (foo(valA, val) ||
252b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek      (int)val != val) // no-warning
253b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek    return true;
254b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  result = val; // no-warning
255b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  return false;
256b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek}
257b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek
25841c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek// Test handling of new[].
25941c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenekvoid rdar9212512() {
26041c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek  int *x = new int[10];
26141c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek  for (unsigned i = 0 ; i < 2 ; ++i) {
26241c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek    // This previously triggered an uninitialized values warning.
26341c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek    x[i] = 1;  // no-warning
26441c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek  }
26541c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek}
266b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek
26794ae8fd470471134114599ccfc2301da05719212Ted Kremenek// Test basic support for dynamic_cast<>.
26894ae8fd470471134114599ccfc2301da05719212Ted Kremenekstruct Rdar9212495_C { virtual void bar() const; };
26994ae8fd470471134114599ccfc2301da05719212Ted Kremenekclass Rdar9212495_B : public Rdar9212495_C {};
27094ae8fd470471134114599ccfc2301da05719212Ted Kremenekclass Rdar9212495_A : public Rdar9212495_B {};
27194ae8fd470471134114599ccfc2301da05719212Ted Kremenekconst Rdar9212495_A& rdar9212495(const Rdar9212495_C* ptr) {
27294ae8fd470471134114599ccfc2301da05719212Ted Kremenek  const Rdar9212495_A& val = dynamic_cast<const Rdar9212495_A&>(*ptr);
27394ae8fd470471134114599ccfc2301da05719212Ted Kremenek
2749f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose  // This is not valid C++; dynamic_cast with a reference type will throw an
275a8695180217806bb421cfc6700bec76fc0b1ae56Jordan Rose  // exception if the pointer does not match the expected type. However, our
276a8695180217806bb421cfc6700bec76fc0b1ae56Jordan Rose  // implementation of dynamic_cast will pass through a null pointer...or a
277a8695180217806bb421cfc6700bec76fc0b1ae56Jordan Rose  // "null reference"! So this branch is actually possible.
27894ae8fd470471134114599ccfc2301da05719212Ted Kremenek  if (&val == 0) {
279a8695180217806bb421cfc6700bec76fc0b1ae56Jordan Rose    val.bar(); // expected-warning{{Called C++ object pointer is null}}
28094ae8fd470471134114599ccfc2301da05719212Ted Kremenek  }
28194ae8fd470471134114599ccfc2301da05719212Ted Kremenek
28294ae8fd470471134114599ccfc2301da05719212Ted Kremenek  return val;
28394ae8fd470471134114599ccfc2301da05719212Ted Kremenek}
28494ae8fd470471134114599ccfc2301da05719212Ted Kremenek
2859f3b9d54ccbbf212591602f389ebde7923627490Jordan Roseconst Rdar9212495_A* rdar9212495_ptr(const Rdar9212495_C* ptr) {
2869f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose  const Rdar9212495_A* val = dynamic_cast<const Rdar9212495_A*>(ptr);
2879f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose
2889f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose  if (val == 0) {
2899f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose    val->bar(); // expected-warning{{Called C++ object pointer is null}}
2909f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose  }
2919f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose
2929f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose  return val;
2939f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose}
2949f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose
2955fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek// Test constructors invalidating arguments.  Previously this raised
2965fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek// an uninitialized value warning.
2975fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenekextern "C" void __attribute__((noreturn)) PR9645_exit(int i);
2985fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek
2995fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenekclass PR9645_SideEffect
3005fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek{
3015fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenekpublic:
3025fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek  PR9645_SideEffect(int *pi); // caches pi in i_
3035fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek  void Read(int *pi); // copies *pi into *i_
3045fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenekprivate:
3055fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek  int *i_;
3065fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek};
3075fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek
3085fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenekvoid PR9645() {
3095fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek  int i;
3105fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek
3115fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek  PR9645_SideEffect se(&i);
3125fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek  int j = 1;
3135fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek  se.Read(&j); // this has a side-effect of initializing i.
3145fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek
3155fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek  PR9645_exit(i); // no-warning
3165fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek}
3175fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek
3185fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed KremenekPR9645_SideEffect::PR9645_SideEffect(int *pi) : i_(pi) {}
3195fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenekvoid PR9645_SideEffect::Read(int *pi) { *i_ = *pi; }
3209fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek
3219fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek// Invalidate fields during C++ method calls.
3229fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenekclass RDar9267815 {
3239fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  int x;
3249fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  void test();
3259fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  void test_pos();
3269fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  void test2();
3279fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  void invalidate();
3289fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek};
3299fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek
3309fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenekvoid RDar9267815::test_pos() {
3319fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  int *p = 0;
3329fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  if (x == 42)
3339fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek    return;
3349fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  *p = 0xDEADBEEF; // expected-warning {{null}}
3359fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek}
3369fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenekvoid RDar9267815::test() {
3379fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  int *p = 0;
3389fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  if (x == 42)
3399fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek    return;
3409fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  if (x == 42)
3419fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek    *p = 0xDEADBEEF; // no-warning
3429fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek}
3439fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek
3449fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenekvoid RDar9267815::test2() {
3459fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  int *p = 0;
3469fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  if (x == 42)
3479fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek    return;
3489fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  invalidate();
3499fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek  if (x == 42)
3509fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek    *p = 0xDEADBEEF; // expected-warning {{null}}
3519fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek}
3529fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek
353235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek// Test reference parameters.
354235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenekvoid test_ref_double_aux(double &Value);
355235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenekfloat test_ref_double() {
356235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek  double dVal;
357235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek  test_ref_double_aux(dVal);
358235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek  // This previously warned because 'dVal' was thought to be uninitialized.
359235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek  float Val = (float)dVal; // no-warning
360235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek  return Val;
361235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek}
362235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek
363bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek// Test invalidation of class fields.
364bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenekclass TestInvalidateClass {
365bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenekpublic:
366bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek  int x;
367bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek};
368bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek
369bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenekvoid test_invalidate_class_aux(TestInvalidateClass &x);
370bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek
371bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenekint test_invalidate_class() {
372bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek  TestInvalidateClass y;
373bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek  test_invalidate_class_aux(y);
374bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek  return y.x; // no-warning
375bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek}
376bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek
3773bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek// Test correct pointer arithmetic using 'p--'.  This is to warn that we
3783bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek// were loading beyond the written characters in buf.
3793bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenekchar *RDar9269695(char *dst, unsigned int n)
3803bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek{
3813bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek  char buff[40], *p;
3823bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek
3833bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek  p = buff;
3843bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek  do
3853bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek    *p++ = '0' + n % 10;
3863bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek  while (n /= 10);
3873bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek
3883bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek  do
3893bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek    *dst++ = *--p; // no-warning
3903bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek  while (p != buff);
3913bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek
3923bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek  return dst;
3933bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek}
3943bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek
3959d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek// Test that we invalidate byref arguments passed to constructors.
3969d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenekclass TestInvalidateInCtor {
3979d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenekpublic:
3989d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek  TestInvalidateInCtor(unsigned &x);
3999d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek};
4009d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek
4019d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenekunsigned test_invalidate_in_ctor() {
4029d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek  unsigned x;
4039d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek  TestInvalidateInCtor foo(x);
4049d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek  return x; // no-warning
4059d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek}
4069d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenekunsigned test_invalidate_in_ctor_new() {
4079d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek  unsigned x;
4089d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek  delete (new TestInvalidateInCtor(x));
4099d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek  return x; // no-warning
4109d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek}
4113bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek
412c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek// Test assigning into a symbolic offset.
413c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenekstruct TestAssignIntoSymbolicOffset {
414c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek  int **stuff[100];
415c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek  void test(int x, int y);
416c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek};
417c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek
418c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenekvoid TestAssignIntoSymbolicOffset::test(int x, int y) {
419c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek  x--;
420c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek  if (x > 8 || x < 0)
421c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek    return;
422c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek  if (stuff[x])
423c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek    return;
424c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek  if (!stuff[x]) {
425c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek    stuff[x] = new int*[y+1];
426c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek    // Previously triggered a null dereference.
427c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek    stuff[x][y] = 0; // no-warning
428c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek  }
429c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek}
430c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek
4315bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek// Test loads from static fields.  This previously triggered an uninitialized
4325bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek// value warning.
4335bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenekclass ClassWithStatic {
4345bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenekpublic:
4355bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek    static const unsigned value = 1;
4365bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek};
4375bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek
4385bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenekint rdar9948787_negative() {
4395bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek    ClassWithStatic classWithStatic;
4405bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek    unsigned value = classWithStatic.value;
4415bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek    if (value == 1)
4425bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek      return 1;
4435bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek    int *p = 0;
4445bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek    *p = 0xDEADBEEF; // no-warning
4455bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek    return 0;
4465bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek}
4475bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek
4485bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenekint rdar9948787_positive() {
4495bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek    ClassWithStatic classWithStatic;
4505bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek    unsigned value = classWithStatic.value;
4515bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek    if (value == 0)
4525bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek      return 1;
4535bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek    int *p = 0;
4545bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek    *p = 0xDEADBEEF; // expected-warning {{null}}
4555bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek    return 0;
4565bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek}
4575bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek
458e4c6675cccbaac991843def43072687bca50d989Ted Kremenek// Regression test against global constants and switches.
459e4c6675cccbaac991843def43072687bca50d989Ted Kremenekenum rdar10202899_ValT { rdar10202899_ValTA, rdar10202899_ValTB, rdar10202899_ValTC };
460e4c6675cccbaac991843def43072687bca50d989Ted Kremenekconst rdar10202899_ValT val = rdar10202899_ValTA;
461e4c6675cccbaac991843def43072687bca50d989Ted Kremenekvoid rdar10202899_test1() {
462e4c6675cccbaac991843def43072687bca50d989Ted Kremenek  switch (val) {
463e4c6675cccbaac991843def43072687bca50d989Ted Kremenek    case rdar10202899_ValTA: {}
464e4c6675cccbaac991843def43072687bca50d989Ted Kremenek  };
465e4c6675cccbaac991843def43072687bca50d989Ted Kremenek}
466e4c6675cccbaac991843def43072687bca50d989Ted Kremenek
467e4c6675cccbaac991843def43072687bca50d989Ted Kremenekvoid rdar10202899_test2() {
468e4c6675cccbaac991843def43072687bca50d989Ted Kremenek  if (val == rdar10202899_ValTA)
469e4c6675cccbaac991843def43072687bca50d989Ted Kremenek   return;
470e4c6675cccbaac991843def43072687bca50d989Ted Kremenek  int *p = 0;
471e4c6675cccbaac991843def43072687bca50d989Ted Kremenek  *p = 0xDEADBEEF;
472e4c6675cccbaac991843def43072687bca50d989Ted Kremenek}
473e4c6675cccbaac991843def43072687bca50d989Ted Kremenek
474e4c6675cccbaac991843def43072687bca50d989Ted Kremenekvoid rdar10202899_test3() {
475e4c6675cccbaac991843def43072687bca50d989Ted Kremenek  switch (val) {
476e4c6675cccbaac991843def43072687bca50d989Ted Kremenek    case rdar10202899_ValTA: return;
477e4c6675cccbaac991843def43072687bca50d989Ted Kremenek    default: ;
478e4c6675cccbaac991843def43072687bca50d989Ted Kremenek  };
479e4c6675cccbaac991843def43072687bca50d989Ted Kremenek  int *p = 0;
480e4c6675cccbaac991843def43072687bca50d989Ted Kremenek  *p = 0xDEADBEEF;
481e4c6675cccbaac991843def43072687bca50d989Ted Kremenek}
482e4c6675cccbaac991843def43072687bca50d989Ted Kremenek
483e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II// This used to crash the analyzer because of the unnamed bitfield.
484e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow IIvoid PR11249()
485e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II{
486e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II  struct {
487e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II    char f1:4;
488e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II    char   :4;
489e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II    char f2[1];
490e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II    char f3;
491e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II  } V = { 1, {2}, 3 };
492e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II  int *p = 0;
493e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II  if (V.f1 != 1)
494e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II    *p = 0xDEADBEEF;  // no-warning
495e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II  if (V.f2[0] != 2)
496e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II    *p = 0xDEADBEEF;  // no-warning
497e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II  if (V.f3 != 3)
498e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II    *p = 0xDEADBEEF;  // no-warning
499e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II}
500e4c6675cccbaac991843def43072687bca50d989Ted Kremenek
501214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenek// Handle doing a load from the memory associated with the code for
502214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenek// a function.
503214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenekextern double nan( const char * );
504214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenekdouble PR11450() {
505214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenek  double NaN = *(double*) nan;
506214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenek  return NaN;
507214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenek}
508214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenek
50960a4481fd9e5dc68b1070306bd70f2865985961dTed Kremenek// Test that 'this' is assumed non-null upon analyzing the entry to a "top-level"
510a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek// function (i.e., when not analyzing from a specific caller).
511a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenekstruct TestNullThis {
512a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek  int field;
513a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek  void test();
514a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek};
515a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek
516a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenekvoid TestNullThis::test() {
517a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek  int *p = &field;
518a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek  if (p)
519a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek    return;
520a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek  field = 2; // no-warning
521a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek}
522a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek
523337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek// Test handling of 'catch' exception variables, and not warning
524337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek// about uninitialized values.
525337e4dbc6859589b8878146a88bebf754e916702Ted Kremenekenum MyEnum { MyEnumValue };
526337e4dbc6859589b8878146a88bebf754e916702Ted KremenekMyEnum rdar10892489() {
527337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek  try {
528337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek      throw MyEnumValue;
529337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek  } catch (MyEnum e) {
530337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek      return e; // no-warning
531337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek  }
532337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek  return MyEnumValue;
533337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek}
534337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek
535337e4dbc6859589b8878146a88bebf754e916702Ted KremenekMyEnum rdar10892489_positive() {
536337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek  try {
537337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek    throw MyEnumValue;
538337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek  } catch (MyEnum e) {
539337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek    int *p = 0;
540c32a453e40b2c8878fed10512fb2f570b7aba576Jordan Rose    // FALSE NEGATIVE
541c32a453e40b2c8878fed10512fb2f570b7aba576Jordan Rose    *p = 0xDEADBEEF; // {{null}}
542337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek    return e;
543337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek  }
544337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek  return MyEnumValue;
545337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek}
546337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek
547ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek// Test handling of catch with no condition variable.
548ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenekvoid PR11545() {
549ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  try
550ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  {
551ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek      throw;
552ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  }
553ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  catch (...)
554ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  {
555ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  }
556ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek}
557ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek
558ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenekvoid PR11545_positive() {
559ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  try
560ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  {
561ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek      throw;
562ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  }
563ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  catch (...)
564ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  {
565ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek    int *p = 0;
566c32a453e40b2c8878fed10512fb2f570b7aba576Jordan Rose    // FALSE NEGATIVE
567c32a453e40b2c8878fed10512fb2f570b7aba576Jordan Rose    *p = 0xDEADBEEF; // {{null}}
568ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek  }
569ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek}
570ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek
5715aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek// Test handling taking the address of a field.  While the analyzer
5725aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek// currently doesn't do anything intelligent here, this previously
5735aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek// resulted in a crash.
5745aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenekclass PR11146 {
5755aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenekpublic:
5765aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek  struct Entry;
5775aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek  void baz();
5785aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek};
5795aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek
5805aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenekstruct PR11146::Entry {
5815aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek  int x;
5825aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek};
5835aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek
5845aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenekvoid PR11146::baz() {
5855aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek  (void) &Entry::x;
5865aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek}
587b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek
588b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek// Test symbolicating a reference.  In this example, the
589b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek// analyzer (originally) didn't know how to handle x[index - index2],
590b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek// returning an UnknownVal.  The conjured symbol wasn't a location,
591b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek// and would result in a crash.
592b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenekvoid rdar10924675(unsigned short x[], int index, int index2) {
593b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek  unsigned short &y = x[index - index2];
594b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek  if (y == 0)
595b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek    return;
596b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek}
597c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek
598c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek// Test handling CXXScalarValueInitExprs.
599c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenekvoid rdar11401827() {
600c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek  int x = int();
601c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek  if (!x) {
602c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek    int *p = 0;
603c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek    *p = 0xDEADBEEF; // expected-warning {{null pointer}}
604c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek  }
605c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek  else {
606c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek    int *p = 0;
607c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek    *p = 0xDEADBEEF;
608c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek  }
609c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek}
610c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek
61110f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek//===---------------------------------------------------------------------===//
61210f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek// Handle inlining of C++ method calls.
61310f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek//===---------------------------------------------------------------------===//
61410f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek
61510f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenekstruct A {
61610f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek  int *p;
61710f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek  void foo(int *q) {
61810f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek    p = q;
61910f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek  }
62010f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek  void bar() {
62110f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek    *p = 0; // expected-warning {{null pointer}}
62210f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek  }
62310f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek};
62410f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek
62510f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenekvoid test_inline() {
62610f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek  A a;
62710f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek  a.foo(0);
62810f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek  a.bar();
62910f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek}
63010f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek
631dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaksvoid test_alloca_in_a_recursive_function(int p1) {
632dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaks    __builtin_alloca (p1);
633dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaks    test_alloca_in_a_recursive_function(1);
634dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaks    test_alloca_in_a_recursive_function(2);
635dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaks}
636bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek
637bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek//===---------------------------------------------------------------------===//
638bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek// Random tests.
639bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek//===---------------------------------------------------------------------===//
640bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek
641bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek// Tests assigning using a C-style initializer to a struct
642bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek// variable whose sub-field is also a struct.  This currently
643bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek// results in a CXXTempObjectRegion being created, but not
644bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek// properly handled.  For now, we just ignore that value
645bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek// to avoid a crash (<rdar://problem/12753384>).
646bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenekstruct RDar12753384_ClassA {
647bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek  unsigned z;
648bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek};
649bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenekstruct  RDar12753384_ClassB {
650bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek  unsigned x;
651bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek  RDar12753384_ClassA y[ 8 ] ;
652bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek};
653bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenekunsigned RDar12753384() {
654bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek  RDar12753384_ClassB w = { 0x00 };
655bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek  RDar12753384_ClassA y[8];
656bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek  return w.x;
657bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek}
658bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek
6591994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek// This testcase tests whether we treat the anonymous union and union
6601994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek// the same way.  This previously resulted in a "return of stack address"
6611994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek// warning because the anonymous union resulting in a temporary object
6621994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek// getting put into the initializer.  We still aren't handling this correctly,
6631994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek// but now if a temporary object appears in an initializer we just ignore it.
6641994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek// Fixes <rdar://problem/12755044>.
6651994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek
6661994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenekstruct Rdar12755044_foo
6671994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek{
6681994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek    struct Rdar12755044_bar
6691994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek    {
6701994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek        union baz
6711994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek        {
6721994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek            int   i;
6731994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek        };
6741994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek    } aBar;
6751994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek};
6761994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek
6771994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenekstruct Rdar12755044_foo_anon
6781994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek{
6791994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek    struct Rdar12755044_bar
6801994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek    {
6811994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek        union
6821994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek        {
6831994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek            int   i;
6841994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek        };
6851994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek    } aBar;
6861994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek};
6871994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek
6881994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenekconst Rdar12755044_foo_anon *radar12755044_anon() {
6891994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek  static const Rdar12755044_foo_anon Rdar12755044_foo_list[] = { { { } } };
6901994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek  return Rdar12755044_foo_list; // no-warning
6911994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek}
6921994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek
6931994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenekconst Rdar12755044_foo *radar12755044() {
6941994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek  static const Rdar12755044_foo Rdar12755044_foo_list[] = { { { } } };
6951994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek  return Rdar12755044_foo_list; // no-warning
6961994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek}
6979c0466603f2051fec9270686dfcd270630e62530Ted Kremenek
6989c0466603f2051fec9270686dfcd270630e62530Ted Kremenek// Test the correct handling of integer to bool conversions.  Previously
6999c0466603f2051fec9270686dfcd270630e62530Ted Kremenek// this resulted in a false positive because integers were being truncated
7009c0466603f2051fec9270686dfcd270630e62530Ted Kremenek// and not tested for non-zero.
7019c0466603f2051fec9270686dfcd270630e62530Ted Kremenekvoid rdar12759044() {
7029c0466603f2051fec9270686dfcd270630e62530Ted Kremenek  int flag = 512;
7039c0466603f2051fec9270686dfcd270630e62530Ted Kremenek  if (!(flag & 512)) {
7049c0466603f2051fec9270686dfcd270630e62530Ted Kremenek   int *p = 0;
7059c0466603f2051fec9270686dfcd270630e62530Ted Kremenek   *p = 0xDEADBEEF; // no-warning
7069c0466603f2051fec9270686dfcd270630e62530Ted Kremenek  }
7079c0466603f2051fec9270686dfcd270630e62530Ted Kremenek}
708beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek
709beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek// The analyzer currently does not model complex types.  Test that the load
710beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek// from 'x' is not flagged as being uninitialized.
711beac9e3772e255f89dad0abe34811953121912b2Ted Kremenektypedef __complex__ float _ComplexT;
712beac9e3772e255f89dad0abe34811953121912b2Ted Kremenekvoid rdar12964481(_ComplexT *y) {
713beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek   _ComplexT x;
714beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek   __real__ x = 1.0;
715beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek   __imag__ x = 1.0;
716beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek   *y *= x; // no-warning
717beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek}
718beac9e3772e255f89dad0abe34811953121912b2Ted Kremenekvoid rdar12964481_b(_ComplexT *y) {
719beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek   _ComplexT x;
720beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek   // Eventually this should be a warning.
721beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek   *y *= x; // no-warning
722beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek}
723beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek
72488de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek// Test case for PR 12921.  This previously produced
72588de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek// a bogus warning.
72688de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenekstatic const int pr12921_arr[] = { 0, 1 };
72788de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenekstatic const int pr12921_arrcount = sizeof(pr12921_arr)/sizeof(int);
72888de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek
72988de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenekint pr12921(int argc, char **argv) {
73088de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek  int i, retval;
73188de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek  for (i = 0; i < pr12921_arrcount; i++) {
73288de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek    if (argc == i) {
73388de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek      retval = i;
73488de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek      break;
73588de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek    }
73688de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek  }
73788de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek
73888de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek  // No match
73988de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek  if (i == pr12921_arrcount) return 66;
74088de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek  return pr12921_arr[retval];
74188de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek}
74288de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek
743