1c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// RUN: %clang_cc1 -triple i386-apple-darwin9 -analyze -analyzer-checker=core,alpha.core,debug.ExprInspection -analyzer-store=region -verify -fblocks -analyzer-opt-analyze-nested-blocks %s -fexceptions -fcxx-exceptions -Wno-tautological-undefined-compare 2c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -analyze -analyzer-checker=core,alpha.core,debug.ExprInspection -analyzer-store=region -verify -fblocks -analyzer-opt-analyze-nested-blocks %s -fexceptions -fcxx-exceptions -Wno-tautological-undefined-compare 3d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose 4d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rosevoid clang_analyzer_warnIfReached(); 5d87682ed3c3e5d748d13a5c4f1cbb267aa756b31Ted Kremenek 653287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenek// Test basic handling of references. 7d87682ed3c3e5d748d13a5c4f1cbb267aa756b31Ted Kremenekchar &test1_aux(); 8d87682ed3c3e5d748d13a5c4f1cbb267aa756b31Ted Kremenekchar *test1() { 9d87682ed3c3e5d748d13a5c4f1cbb267aa756b31Ted Kremenek return &test1_aux(); 10d87682ed3c3e5d748d13a5c4f1cbb267aa756b31Ted Kremenek} 1153287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenek 12910e4080986045cc2036f8d1f55398acc7fbb257Zhongxing Xu// Test test1_aux() evaluates to char &. 1353287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenekchar test1_as_rvalue() { 1453287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenek return test1_aux(); 1553287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenek} 1653287518f69b8f06f82a6cdbd13e4e3a13b58186Ted Kremenek 17949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek// Test passing a value as a reference. The 'const' in test2_aux() adds 18949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek// an ImplicitCastExpr, which is evaluated as an lvalue. 19949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenekint test2_aux(const int &n); 20949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenekint test2(int n) { 21949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek return test2_aux(n); 22949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek} 23949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek 24949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenekint test2_b_aux(const short &n); 25949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenekint test2_b(int n) { 26949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek return test2_b_aux(n); 27949bdb43bf370b23a79a37b017e0a0566c0d66e0Ted Kremenek} 28077a40df258beb46cb746af61da115e9718a6affTed Kremenek 29077a40df258beb46cb746af61da115e9718a6affTed Kremenek// Test getting the lvalue of a derived and converting it to a base. This 30077a40df258beb46cb746af61da115e9718a6affTed Kremenek// previously crashed. 31077a40df258beb46cb746af61da115e9718a6affTed Kremenekclass Test3_Base {}; 32077a40df258beb46cb746af61da115e9718a6affTed Kremenekclass Test3_Derived : public Test3_Base {}; 33077a40df258beb46cb746af61da115e9718a6affTed Kremenek 34077a40df258beb46cb746af61da115e9718a6affTed Kremenekint test3_aux(Test3_Base &x); 35077a40df258beb46cb746af61da115e9718a6affTed Kremenekint test3(Test3_Derived x) { 36077a40df258beb46cb746af61da115e9718a6affTed Kremenek return test3_aux(x); 37077a40df258beb46cb746af61da115e9718a6affTed Kremenek} 38077a40df258beb46cb746af61da115e9718a6affTed Kremenek 39de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek//===---------------------------------------------------------------------===// 40de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek// Test CFG support for C++ condition variables. 41de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek//===---------------------------------------------------------------------===// 42de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 4361dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenekint test_init_in_condition_aux(); 4461dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenekint test_init_in_condition() { 4561dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenek if (int x = test_init_in_condition_aux()) { // no-warning 4661dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenek return 1; 4761dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenek } 4861dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenek return 0; 4961dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenek} 50fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek 51fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenekint test_init_in_condition_switch() { 52fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek switch (int x = test_init_in_condition_aux()) { // no-warning 53fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek case 1: 54fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek return 0; 55fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek case 2: 56fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek if (x == 2) 57fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek return 0; 58fcfb503c280ed8c66d428fed911b2846c0f434fcTed Kremenek else { 59d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose clang_analyzer_warnIfReached(); // unreachable 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 77d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose clang_analyzer_warnIfReached(); // unreachable 784c508a12cedcf2896412a3700c1b2a35bf339828Ted Kremenek return 0; 794c508a12cedcf2896412a3700c1b2a35bf339828Ted Kremenek} 804ec010a6ccf4db2ab2ef9e68942642d50f7f193cTed Kremenek 81dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek 82dd8b44101281c894026c7070da6e826c542ea87bTed Kremenekint test_init_in_condition_for() { 83dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek int z = 0; 84dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek for (int x = 0; int y = ++z; ++x) { 85dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek if (x == y) // no-warning 86dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek break; 87dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek } 88dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek if (z == 1) 89dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek return 0; 90dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek 91d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose clang_analyzer_warnIfReached(); // unreachable 92dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek return 0; 93dd8b44101281c894026c7070da6e826c542ea87bTed Kremenek} 94de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 95de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek//===---------------------------------------------------------------------===// 96de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek// Test handling of 'this' pointer. 97de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek//===---------------------------------------------------------------------===// 98de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 99de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekclass TestHandleThis { 100de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek int x; 101de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 102de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek TestHandleThis(); 103de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek int foo(); 104de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek int null_deref_negative(); 105de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek int null_deref_positive(); 106de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek}; 107de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 108de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekint TestHandleThis::foo() { 109de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek // Assume that 'x' is initialized. 110de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return x + 1; // no-warning 111de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek} 112de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 113de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekint TestHandleThis::null_deref_negative() { 114de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek x = 10; 115de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek if (x == 10) { 116de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return 1; 117de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek } 118d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose clang_analyzer_warnIfReached(); // unreachable 119de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return 0; 120de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek} 121de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 122de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekint TestHandleThis::null_deref_positive() { 123de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek x = 10; 124de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek if (x == 9) { 125de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return 1; 126de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek } 127d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 128de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek return 0; 129de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek} 130de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 131741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek// PR 7675 - passing literals by-reference 132741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenekvoid pr7675(const double &a); 133741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenekvoid pr7675(const int &a); 134741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenekvoid pr7675(const char &a); 135741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenekvoid pr7675_i(const _Complex double &a); 136741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek 137741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenekvoid pr7675_test() { 138741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek pr7675(10.0); 139741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek pr7675(10); 140741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek pr7675('c'); 141741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek pr7675_i(4.0i); 142d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose 143d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose // Add check to ensure we are analyzing the code up to this point. 144d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 145741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek} 146741b9be084a61b4d5eb9b626f7f75949cfda3b11Ted Kremenek 147a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek// <rdar://problem/8375510> - CFGBuilder should handle temporaries. 148a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenekstruct R8375510 { 149a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek R8375510(); 150a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek ~R8375510(); 151a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek R8375510 operator++(int); 152a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek}; 153a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek 154a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenekint r8375510(R8375510 x, R8375510 y) { 155a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek for (; ; x++) { } 156a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek} 157a427f1d8f0848997029d1bdc0c5c137f982f775dTed Kremenek 15899cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan// PR8419 -- this used to crash. 15999cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan 16099cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wanclass String8419 { 16199cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan public: 16299cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan char& get(int n); 16399cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan char& operator[](int n); 16499cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan}; 16599cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan 16699cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wanchar& get8419(); 16799cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan 16899cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wanvoid Test8419() { 16999cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan String8419 s; 17099cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan ++(s.get(0)); 17199cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan get8419()--; // used to crash 17299cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan --s[0]; // used to crash 17399cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan s[0] &= 1; // used to crash 17499cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan s[0]++; // used to crash 17599cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan} 17699cae5b67b9711ca260e5b364a878a1a91183632Zhanyong Wan 177739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan// PR8426 -- this used to crash. 178739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan 179739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanvoid Use(void* to); 180739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan 181739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <class T> class Foo { 182739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan ~Foo(); 183739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan struct Bar; 184739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan Bar* bar_; 185739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan}; 186739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan 187739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <class T> Foo<T>::~Foo() { 188739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan Use(bar_); 189739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan T::DoSomething(); 190739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan bar_->Work(); 191739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan} 192739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan 193739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan// PR8427 -- this used to crash. 194739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan 195739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanclass Dummy {}; 196739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan 197739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanbool operator==(Dummy, int); 198739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan 199739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <typename T> 200739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanclass Foo2 { 201739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan bool Bar(); 202739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan}; 203739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan 204739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <typename T> 205739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanbool Foo2<T>::Bar() { 206739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan return 0 == T(); 207739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan} 208739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan 209739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan// PR8433 -- this used to crash. 210739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan 211739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <typename T> 212739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanclass Foo3 { 213739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan public: 214739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan void Bar(); 215739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan void Baz(); 216739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan T value_; 217739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan}; 218739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan 219739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wantemplate <typename T> 220739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wanvoid Foo3<T>::Bar() { 221739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan Baz(); 222739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan value_(); 223739830d278b0a174edc59edcfedaecec53d36e3fZhanyong Wan} 224b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek 225b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek//===---------------------------------------------------------------------===// 226b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek// Handle misc. C++ constructs. 227b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek//===---------------------------------------------------------------------===// 228b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek 229b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremeneknamespace fum { 230b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek int i = 3; 231b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek}; 232b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek 233b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenekvoid test_namespace() { 234b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek // Previously triggered a crash. 235b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek using namespace fum; 236b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek int x = i; 237b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek} 238b8b07b171041561eb28024d5b4d07227c971c0f9Ted Kremenek 239b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek// Test handling methods that accept references as parameters, and that 240b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek// variables are properly invalidated. 241b277159055933e610bbc80262b600d3ad7e0595cTed Kremenekclass RDar9203355 { 242b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek bool foo(unsigned valA, long long &result) const; 243b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek bool foo(unsigned valA, int &result) const; 244b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek}; 245b277159055933e610bbc80262b600d3ad7e0595cTed Kremenekbool RDar9203355::foo(unsigned valA, int &result) const { 246b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek long long val; 247b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek if (foo(valA, val) || 248b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek (int)val != val) // no-warning 249b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek return true; 250b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek result = val; // no-warning 251b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek return false; 252b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek} 253b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek 25441c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek// Test handling of new[]. 25541c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenekvoid rdar9212512() { 25641c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek int *x = new int[10]; 25741c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek for (unsigned i = 0 ; i < 2 ; ++i) { 25841c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek // This previously triggered an uninitialized values warning. 25941c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek x[i] = 1; // no-warning 26041c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek } 26141c5f498b2d10fab683f1c5685ff79c90a737d24Ted Kremenek} 262b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek 26394ae8fd470471134114599ccfc2301da05719212Ted Kremenek// Test basic support for dynamic_cast<>. 26494ae8fd470471134114599ccfc2301da05719212Ted Kremenekstruct Rdar9212495_C { virtual void bar() const; }; 26594ae8fd470471134114599ccfc2301da05719212Ted Kremenekclass Rdar9212495_B : public Rdar9212495_C {}; 26694ae8fd470471134114599ccfc2301da05719212Ted Kremenekclass Rdar9212495_A : public Rdar9212495_B {}; 26794ae8fd470471134114599ccfc2301da05719212Ted Kremenekconst Rdar9212495_A& rdar9212495(const Rdar9212495_C* ptr) { 26894ae8fd470471134114599ccfc2301da05719212Ted Kremenek const Rdar9212495_A& val = dynamic_cast<const Rdar9212495_A&>(*ptr); 26994ae8fd470471134114599ccfc2301da05719212Ted Kremenek 2709f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose // This is not valid C++; dynamic_cast with a reference type will throw an 271a8695180217806bb421cfc6700bec76fc0b1ae56Jordan Rose // exception if the pointer does not match the expected type. However, our 272a8695180217806bb421cfc6700bec76fc0b1ae56Jordan Rose // implementation of dynamic_cast will pass through a null pointer...or a 273a8695180217806bb421cfc6700bec76fc0b1ae56Jordan Rose // "null reference"! So this branch is actually possible. 27494ae8fd470471134114599ccfc2301da05719212Ted Kremenek if (&val == 0) { 275a8695180217806bb421cfc6700bec76fc0b1ae56Jordan Rose val.bar(); // expected-warning{{Called C++ object pointer is null}} 27694ae8fd470471134114599ccfc2301da05719212Ted Kremenek } 27794ae8fd470471134114599ccfc2301da05719212Ted Kremenek 27894ae8fd470471134114599ccfc2301da05719212Ted Kremenek return val; 27994ae8fd470471134114599ccfc2301da05719212Ted Kremenek} 28094ae8fd470471134114599ccfc2301da05719212Ted Kremenek 2819f3b9d54ccbbf212591602f389ebde7923627490Jordan Roseconst Rdar9212495_A* rdar9212495_ptr(const Rdar9212495_C* ptr) { 2829f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose const Rdar9212495_A* val = dynamic_cast<const Rdar9212495_A*>(ptr); 2839f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose 2849f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose if (val == 0) { 2859f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose val->bar(); // expected-warning{{Called C++ object pointer is null}} 2869f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose } 2879f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose 2889f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose return val; 2899f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose} 2909f3b9d54ccbbf212591602f389ebde7923627490Jordan Rose 2915fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek// Test constructors invalidating arguments. Previously this raised 2925fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek// an uninitialized value warning. 2935fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenekextern "C" void __attribute__((noreturn)) PR9645_exit(int i); 2945fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek 2955fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenekclass PR9645_SideEffect 2965fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek{ 2975fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenekpublic: 2985fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek PR9645_SideEffect(int *pi); // caches pi in i_ 2995fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek void Read(int *pi); // copies *pi into *i_ 3005fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenekprivate: 3015fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek int *i_; 3025fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek}; 3035fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek 3045fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenekvoid PR9645() { 3055fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek int i; 3065fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek 3075fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek PR9645_SideEffect se(&i); 3085fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek int j = 1; 3095fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek se.Read(&j); // this has a side-effect of initializing i. 3105fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek 3115fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek PR9645_exit(i); // no-warning 3125fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek} 3135fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenek 3145fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed KremenekPR9645_SideEffect::PR9645_SideEffect(int *pi) : i_(pi) {} 3155fe98728dca1f3a7a378ce1a21984a0f8a0c0b8bTed Kremenekvoid PR9645_SideEffect::Read(int *pi) { *i_ = *pi; } 3169fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek 3179fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek// Invalidate fields during C++ method calls. 3189fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenekclass RDar9267815 { 3199fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek int x; 3209fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek void test(); 3219fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek void test_pos(); 3229fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek void test2(); 3239fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek void invalidate(); 3249fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek}; 3259fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek 3269fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenekvoid RDar9267815::test_pos() { 3279fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek if (x == 42) 3289fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek return; 329d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 3309fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek} 3319fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenekvoid RDar9267815::test() { 3329fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek if (x == 42) 3339fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek return; 3349fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek if (x == 42) 335d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose clang_analyzer_warnIfReached(); // no-warning 3369fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek} 3379fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek 3389fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenekvoid RDar9267815::test2() { 3399fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek if (x == 42) 3409fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek return; 3419fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek invalidate(); 3429fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek if (x == 42) 343d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 3449fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek} 3459fec9b1fbd32e71ce8acb701165fd6649b3d8285Ted Kremenek 346235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek// Test reference parameters. 347235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenekvoid test_ref_double_aux(double &Value); 348235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenekfloat test_ref_double() { 349235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek double dVal; 350235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek test_ref_double_aux(dVal); 351235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek // This previously warned because 'dVal' was thought to be uninitialized. 352235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek float Val = (float)dVal; // no-warning 353235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek return Val; 354235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek} 355235c02f79e0ece9463490aa87eaaa02bad300dacTed Kremenek 356bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek// Test invalidation of class fields. 357bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenekclass TestInvalidateClass { 358bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenekpublic: 359bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek int x; 360bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek}; 361bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek 362bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenekvoid test_invalidate_class_aux(TestInvalidateClass &x); 363bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek 364bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenekint test_invalidate_class() { 365bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek TestInvalidateClass y; 366bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek test_invalidate_class_aux(y); 367bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek return y.x; // no-warning 368bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek} 369bf1a66764a12f6cceb6ba8b349d4b74996e3786bTed Kremenek 3703bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek// Test correct pointer arithmetic using 'p--'. This is to warn that we 3713bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek// were loading beyond the written characters in buf. 3723bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenekchar *RDar9269695(char *dst, unsigned int n) 3733bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek{ 3743bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek char buff[40], *p; 3753bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek 3763bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek p = buff; 3773bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek do 3783bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek *p++ = '0' + n % 10; 3793bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek while (n /= 10); 3803bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek 3813bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek do 3823bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek *dst++ = *--p; // no-warning 3833bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek while (p != buff); 3843bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek 3853bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek return dst; 3863bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek} 3873bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek 3889d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek// Test that we invalidate byref arguments passed to constructors. 3899d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenekclass TestInvalidateInCtor { 3909d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenekpublic: 3919d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek TestInvalidateInCtor(unsigned &x); 3929d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek}; 3939d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek 3949d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenekunsigned test_invalidate_in_ctor() { 3959d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek unsigned x; 3969d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek TestInvalidateInCtor foo(x); 3979d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek return x; // no-warning 3989d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek} 3999d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenekunsigned test_invalidate_in_ctor_new() { 4009d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek unsigned x; 4019d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek delete (new TestInvalidateInCtor(x)); 4029d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek return x; // no-warning 4039d5d308c9be367ec41cc6a89f215d45f675b4617Ted Kremenek} 4043bab50b802f402b7020aeb3ba6cec90bb149678cTed Kremenek 405c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek// Test assigning into a symbolic offset. 406c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenekstruct TestAssignIntoSymbolicOffset { 407c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek int **stuff[100]; 408c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek void test(int x, int y); 409c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek}; 410c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek 411c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenekvoid TestAssignIntoSymbolicOffset::test(int x, int y) { 412c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek x--; 413c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek if (x > 8 || x < 0) 414c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek return; 415c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek if (stuff[x]) 416c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek return; 417c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek if (!stuff[x]) { 418c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek stuff[x] = new int*[y+1]; 419c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek // Previously triggered a null dereference. 420c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek stuff[x][y] = 0; // no-warning 421c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek } 422c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek} 423c46d6410947b18ac4c52cff4d0f8021b10a57c1eTed Kremenek 4245bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek// Test loads from static fields. This previously triggered an uninitialized 4255bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek// value warning. 4265bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenekclass ClassWithStatic { 4275bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenekpublic: 4285bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek static const unsigned value = 1; 4295bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek}; 4305bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek 4315bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenekint rdar9948787_negative() { 4325bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek ClassWithStatic classWithStatic; 4335bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek unsigned value = classWithStatic.value; 4345bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek if (value == 1) 4355bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek return 1; 436d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose clang_analyzer_warnIfReached(); // no-warning 4375bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek return 0; 4385bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek} 4395bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek 4405bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenekint rdar9948787_positive() { 4415bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek ClassWithStatic classWithStatic; 4425bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek unsigned value = classWithStatic.value; 4435bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek if (value == 0) 4445bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek return 1; 445d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 4465bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek return 0; 4475bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek} 4485bd04952d4ae7ca894f583583208f0cec4735a90Ted Kremenek 449e4c6675cccbaac991843def43072687bca50d989Ted Kremenek// Regression test against global constants and switches. 450e4c6675cccbaac991843def43072687bca50d989Ted Kremenekenum rdar10202899_ValT { rdar10202899_ValTA, rdar10202899_ValTB, rdar10202899_ValTC }; 451e4c6675cccbaac991843def43072687bca50d989Ted Kremenekconst rdar10202899_ValT val = rdar10202899_ValTA; 452e4c6675cccbaac991843def43072687bca50d989Ted Kremenekvoid rdar10202899_test1() { 453e4c6675cccbaac991843def43072687bca50d989Ted Kremenek switch (val) { 454e4c6675cccbaac991843def43072687bca50d989Ted Kremenek case rdar10202899_ValTA: {} 455e4c6675cccbaac991843def43072687bca50d989Ted Kremenek }; 456e4c6675cccbaac991843def43072687bca50d989Ted Kremenek} 457e4c6675cccbaac991843def43072687bca50d989Ted Kremenek 458e4c6675cccbaac991843def43072687bca50d989Ted Kremenekvoid rdar10202899_test2() { 459e4c6675cccbaac991843def43072687bca50d989Ted Kremenek if (val == rdar10202899_ValTA) 460e4c6675cccbaac991843def43072687bca50d989Ted Kremenek return; 461d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose clang_analyzer_warnIfReached(); // no-warning 462e4c6675cccbaac991843def43072687bca50d989Ted Kremenek} 463e4c6675cccbaac991843def43072687bca50d989Ted Kremenek 464e4c6675cccbaac991843def43072687bca50d989Ted Kremenekvoid rdar10202899_test3() { 465e4c6675cccbaac991843def43072687bca50d989Ted Kremenek switch (val) { 466e4c6675cccbaac991843def43072687bca50d989Ted Kremenek case rdar10202899_ValTA: return; 467e4c6675cccbaac991843def43072687bca50d989Ted Kremenek default: ; 468e4c6675cccbaac991843def43072687bca50d989Ted Kremenek }; 469d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose clang_analyzer_warnIfReached(); // no-warning 470e4c6675cccbaac991843def43072687bca50d989Ted Kremenek} 471e4c6675cccbaac991843def43072687bca50d989Ted Kremenek 472e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II// This used to crash the analyzer because of the unnamed bitfield. 473e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow IIvoid PR11249() 474e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II{ 475e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II struct { 476e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II char f1:4; 477e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II char :4; 478e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II char f2[1]; 479e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II char f3; 480e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II } V = { 1, {2}, 3 }; 481e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II if (V.f1 != 1) 482d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose clang_analyzer_warnIfReached(); // no-warning 483e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II if (V.f2[0] != 2) 484d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose clang_analyzer_warnIfReached(); // no-warning 485e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II if (V.f3 != 3) 486d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose clang_analyzer_warnIfReached(); // no-warning 487e42a0ab77ca4ad5201591aac5679ef47a08af4b6Jim Goodnow II} 488e4c6675cccbaac991843def43072687bca50d989Ted Kremenek 489214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenek// Handle doing a load from the memory associated with the code for 490214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenek// a function. 491214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenekextern double nan( const char * ); 492214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenekdouble PR11450() { 493214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenek double NaN = *(double*) nan; 494214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenek return NaN; 495214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenek} 496214323b78b01ef9c1ad226f0eb5bd1187f3efa70Ted Kremenek 49760a4481fd9e5dc68b1070306bd70f2865985961dTed Kremenek// Test that 'this' is assumed non-null upon analyzing the entry to a "top-level" 498a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek// function (i.e., when not analyzing from a specific caller). 499a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenekstruct TestNullThis { 500a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek int field; 501a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek void test(); 502a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek}; 503a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek 504a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenekvoid TestNullThis::test() { 505a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek int *p = &field; 506a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek if (p) 507a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek return; 508a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek field = 2; // no-warning 509a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek} 510a078ecf3484d62b01d9f8c01e0fecffd65c583e1Ted Kremenek 511337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek// Test handling of 'catch' exception variables, and not warning 512337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek// about uninitialized values. 513337e4dbc6859589b8878146a88bebf754e916702Ted Kremenekenum MyEnum { MyEnumValue }; 514337e4dbc6859589b8878146a88bebf754e916702Ted KremenekMyEnum rdar10892489() { 515337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek try { 516337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek throw MyEnumValue; 517337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek } catch (MyEnum e) { 518337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek return e; // no-warning 519337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek } 520337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek return MyEnumValue; 521337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek} 522337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek 523337e4dbc6859589b8878146a88bebf754e916702Ted KremenekMyEnum rdar10892489_positive() { 524337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek try { 525337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek throw MyEnumValue; 526337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek } catch (MyEnum e) { 527337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek int *p = 0; 528c32a453e40b2c8878fed10512fb2f570b7aba576Jordan Rose // FALSE NEGATIVE 529c32a453e40b2c8878fed10512fb2f570b7aba576Jordan Rose *p = 0xDEADBEEF; // {{null}} 530337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek return e; 531337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek } 532337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek return MyEnumValue; 533337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek} 534337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek 535ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek// Test handling of catch with no condition variable. 536ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenekvoid PR11545() { 537ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek try 538ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek { 539ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek throw; 540ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek } 541ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek catch (...) 542ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek { 543ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek } 544ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek} 545ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek 546ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenekvoid PR11545_positive() { 547ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek try 548ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek { 549ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek throw; 550ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek } 551ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek catch (...) 552ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek { 553ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek int *p = 0; 554c32a453e40b2c8878fed10512fb2f570b7aba576Jordan Rose // FALSE NEGATIVE 555c32a453e40b2c8878fed10512fb2f570b7aba576Jordan Rose *p = 0xDEADBEEF; // {{null}} 556ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek } 557ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek} 558ce612f5a7d306f919c7ae57fcd8c5ecb5d83d54eTed Kremenek 5595aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek// Test handling taking the address of a field. While the analyzer 5605aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek// currently doesn't do anything intelligent here, this previously 5615aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek// resulted in a crash. 5625aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenekclass PR11146 { 5635aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenekpublic: 5645aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek struct Entry; 5655aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek void baz(); 5665aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek}; 5675aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek 5685aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenekstruct PR11146::Entry { 5695aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek int x; 5705aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek}; 5715aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek 5725aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenekvoid PR11146::baz() { 5735aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek (void) &Entry::x; 5745aac0b6ae95f137b1783f3e6227241fb457b8f8bTed Kremenek} 575b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek 576b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek// Test symbolicating a reference. In this example, the 577b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek// analyzer (originally) didn't know how to handle x[index - index2], 578b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek// returning an UnknownVal. The conjured symbol wasn't a location, 579b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek// and would result in a crash. 580b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenekvoid rdar10924675(unsigned short x[], int index, int index2) { 581b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek unsigned short &y = x[index - index2]; 582b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek if (y == 0) 583b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek return; 584b98b998e9a5637012ab39ad1dabdad7c798721e8Ted Kremenek} 585c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek 586c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek// Test handling CXXScalarValueInitExprs. 587c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenekvoid rdar11401827() { 588c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek int x = int(); 589c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek if (!x) { 590d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 591651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ; // Suppress warning that both branches are identical 592c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek } 593c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek else { 594d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose clang_analyzer_warnIfReached(); // no-warning 595c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek } 596c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek} 597c319c585c0d5899cba0dca2272e6e4909c8b9f16Ted Kremenek 59810f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek//===---------------------------------------------------------------------===// 59910f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek// Handle inlining of C++ method calls. 60010f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek//===---------------------------------------------------------------------===// 60110f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek 60210f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenekstruct A { 60310f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek int *p; 60410f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek void foo(int *q) { 60510f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek p = q; 60610f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek } 60710f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek void bar() { 60810f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek *p = 0; // expected-warning {{null pointer}} 60910f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek } 61010f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek}; 61110f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek 61210f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenekvoid test_inline() { 61310f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek A a; 61410f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek a.foo(0); 61510f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek a.bar(); 61610f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek} 61710f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek 618dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaksvoid test_alloca_in_a_recursive_function(int p1) { 619dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaks __builtin_alloca (p1); 620dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaks test_alloca_in_a_recursive_function(1); 621dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaks test_alloca_in_a_recursive_function(2); 622dac6cd533d90fa1f75e66f83f7d5ebc12e34bfb7Anna Zaks} 623bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek 624bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek//===---------------------------------------------------------------------===// 625bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek// Random tests. 626bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek//===---------------------------------------------------------------------===// 627bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek 628bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek// Tests assigning using a C-style initializer to a struct 629bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek// variable whose sub-field is also a struct. This currently 630bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek// results in a CXXTempObjectRegion being created, but not 631bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek// properly handled. For now, we just ignore that value 632bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek// to avoid a crash (<rdar://problem/12753384>). 633bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenekstruct RDar12753384_ClassA { 634bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek unsigned z; 635bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek}; 636bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenekstruct RDar12753384_ClassB { 637bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek unsigned x; 638bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek RDar12753384_ClassA y[ 8 ] ; 639bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek}; 640bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenekunsigned RDar12753384() { 641bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek RDar12753384_ClassB w = { 0x00 }; 642bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek RDar12753384_ClassA y[8]; 643bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek return w.x; 644bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek} 645bd8a11e224c3ec6cbc4bb9b1fc70a8aa3a633e43Ted Kremenek 6461994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek// This testcase tests whether we treat the anonymous union and union 6471994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek// the same way. This previously resulted in a "return of stack address" 6481994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek// warning because the anonymous union resulting in a temporary object 6491994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek// getting put into the initializer. We still aren't handling this correctly, 6501994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek// but now if a temporary object appears in an initializer we just ignore it. 6511994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek// Fixes <rdar://problem/12755044>. 6521994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek 6531994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenekstruct Rdar12755044_foo 6541994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek{ 6551994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek struct Rdar12755044_bar 6561994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek { 6571994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek union baz 6581994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek { 6591994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek int i; 6601994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek }; 6611994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek } aBar; 6621994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek}; 6631994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek 6641994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenekstruct Rdar12755044_foo_anon 6651994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek{ 6661994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek struct Rdar12755044_bar 6671994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek { 6681994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek union 6691994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek { 6701994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek int i; 6711994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek }; 6721994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek } aBar; 6731994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek}; 6741994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek 6751994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenekconst Rdar12755044_foo_anon *radar12755044_anon() { 6761994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek static const Rdar12755044_foo_anon Rdar12755044_foo_list[] = { { { } } }; 6771994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek return Rdar12755044_foo_list; // no-warning 6781994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek} 6791994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek 6801994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenekconst Rdar12755044_foo *radar12755044() { 6811994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek static const Rdar12755044_foo Rdar12755044_foo_list[] = { { { } } }; 6821994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek return Rdar12755044_foo_list; // no-warning 6831994e3993e5e2c606f4ab22563768af6f03dad30Ted Kremenek} 6849c0466603f2051fec9270686dfcd270630e62530Ted Kremenek 6859c0466603f2051fec9270686dfcd270630e62530Ted Kremenek// Test the correct handling of integer to bool conversions. Previously 6869c0466603f2051fec9270686dfcd270630e62530Ted Kremenek// this resulted in a false positive because integers were being truncated 6879c0466603f2051fec9270686dfcd270630e62530Ted Kremenek// and not tested for non-zero. 6889c0466603f2051fec9270686dfcd270630e62530Ted Kremenekvoid rdar12759044() { 6899c0466603f2051fec9270686dfcd270630e62530Ted Kremenek int flag = 512; 6909c0466603f2051fec9270686dfcd270630e62530Ted Kremenek if (!(flag & 512)) { 691d000b852022bcd4fc14029b48d2fa873f63e4032Jordan Rose clang_analyzer_warnIfReached(); // no-warning 6929c0466603f2051fec9270686dfcd270630e62530Ted Kremenek } 6939c0466603f2051fec9270686dfcd270630e62530Ted Kremenek} 694beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek 695beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek// The analyzer currently does not model complex types. Test that the load 696beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek// from 'x' is not flagged as being uninitialized. 697beac9e3772e255f89dad0abe34811953121912b2Ted Kremenektypedef __complex__ float _ComplexT; 698beac9e3772e255f89dad0abe34811953121912b2Ted Kremenekvoid rdar12964481(_ComplexT *y) { 699beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek _ComplexT x; 700beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek __real__ x = 1.0; 701beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek __imag__ x = 1.0; 702beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek *y *= x; // no-warning 703beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek} 704beac9e3772e255f89dad0abe34811953121912b2Ted Kremenekvoid rdar12964481_b(_ComplexT *y) { 705beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek _ComplexT x; 706beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek // Eventually this should be a warning. 707beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek *y *= x; // no-warning 708beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek} 709beac9e3772e255f89dad0abe34811953121912b2Ted Kremenek 71088de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek// Test case for PR 12921. This previously produced 71188de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek// a bogus warning. 71288de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenekstatic const int pr12921_arr[] = { 0, 1 }; 71388de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenekstatic const int pr12921_arrcount = sizeof(pr12921_arr)/sizeof(int); 71488de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek 71588de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenekint pr12921(int argc, char **argv) { 71688de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek int i, retval; 71788de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek for (i = 0; i < pr12921_arrcount; i++) { 71888de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek if (argc == i) { 71988de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek retval = i; 72088de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek break; 72188de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek } 72288de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek } 72388de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek 72488de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek // No match 72588de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek if (i == pr12921_arrcount) return 66; 72688de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek return pr12921_arr[retval]; 72788de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek} 72888de5a0963cbd2b92810d20d1bfbd9eb4951dc42Ted Kremenek 729