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