misc-ps-region-store.cpp revision 94ae8fd470471134114599ccfc2301da05719212
1c4d2c9074be6eb2091086eddd6c8f052f3b245c8Argyrios Kyrtzidis// RUN: %clang_cc1 -triple i386-apple-darwin9 -analyze -analyzer-checker=core,core.experimental -analyzer-store=region -verify -fblocks -analyzer-opt-analyze-nested-blocks %s 2c4d2c9074be6eb2091086eddd6c8f052f3b245c8Argyrios Kyrtzidis// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -analyze -analyzer-checker=core,core.experimental -analyzer-store=region -verify -fblocks -analyzer-opt-analyze-nested-blocks %s 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 27494ae8fd470471134114599ccfc2301da05719212Ted Kremenek if (&val == 0) { 27594ae8fd470471134114599ccfc2301da05719212Ted Kremenek val.bar(); // FIXME: This should eventually be a null dereference. 27694ae8fd470471134114599ccfc2301da05719212Ted Kremenek } 27794ae8fd470471134114599ccfc2301da05719212Ted Kremenek 27894ae8fd470471134114599ccfc2301da05719212Ted Kremenek return val; 27994ae8fd470471134114599ccfc2301da05719212Ted Kremenek} 28094ae8fd470471134114599ccfc2301da05719212Ted Kremenek 281