1cdc3a89d5de90b2299c56f4a46c3de590c5184d1Ted Kremenek// RUN: %clang_cc1 -analyze -analyzer-store=region -analyzer-constraints=range -fblocks -analyzer-opt-analyze-nested-blocks -analyzer-checker=alpha.deadcode.IdempotentOperations -verify %s 2db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care 3db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care// Basic tests 4db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care 5db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Careextern void test(int i); 6453293109e670824d84e94c0c2891737e3261f1fTed Kremenekextern void test_f(float f); 7db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care 8245adabd97c8c770c13935a9075f2243cc6f1d57Tom Careunsigned basic() { 9db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care int x = 10, zero = 0, one = 1; 10db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care 11db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care // x op x 123e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek x = x; // expected-warning {{Assigned value is always the same as the existing value}} 133e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(x - x); // expected-warning {{Both operands to '-' always have the same value}} 143e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek x -= x; // expected-warning {{Both operands to '-=' always have the same value}} 15db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care x = 10; // no-warning 163e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(x / x); // expected-warning {{Both operands to '/' always have the same value}} 173e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek x /= x; // expected-warning {{Both operands to '/=' always have the same value}} 18db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care x = 10; // no-warning 193e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(x & x); // expected-warning {{Both operands to '&' always have the same value}} 203e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek x &= x; // expected-warning {{Both operands to '&=' always have the same value}} 213e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(x | x); // expected-warning {{Both operands to '|' always have the same value}} 223e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek x |= x; // expected-warning {{Both operands to '|=' always have the same value}} 23db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care 24db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care // x op 1 253e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(x * one); // expected-warning {{The right operand to '*' is always 1}} 263e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek x *= one; // expected-warning {{The right operand to '*=' is always 1}} 273e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(x / one); // expected-warning {{The right operand to '/' is always 1}} 283e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek x /= one; // expected-warning {{The right operand to '/=' is always 1}} 29db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care 30db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care // 1 op x 313e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(one * x); // expected-warning {{The left operand to '*' is always 1}} 32db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care 33db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care // x op 0 343e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(x + zero); // expected-warning {{The right operand to '+' is always 0}} 353e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(x - zero); // expected-warning {{The right operand to '-' is always 0}} 363e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(x * zero); // expected-warning {{The right operand to '*' is always 0}} 373e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(x & zero); // expected-warning {{The right operand to '&' is always 0}} 383e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(x | zero); // expected-warning {{The right operand to '|' is always 0}} 393e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(x ^ zero); // expected-warning {{The right operand to '^' is always 0}} 403e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(x << zero); // expected-warning {{The right operand to '<<' is always 0}} 413e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(x >> zero); // expected-warning {{The right operand to '>>' is always 0}} 42db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care 43db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care // 0 op x 443e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(zero + x); // expected-warning {{The left operand to '+' is always 0}} 453e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(zero - x); // expected-warning {{The left operand to '-' is always 0}} 463e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(zero / x); // expected-warning {{The left operand to '/' is always 0}} 473e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(zero * x); // expected-warning {{The left operand to '*' is always 0}} 483e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(zero & x); // expected-warning {{The left operand to '&' is always 0}} 493e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(zero | x); // expected-warning {{The left operand to '|' is always 0}} 503e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(zero ^ x); // expected-warning {{The left operand to '^' is always 0}} 513e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(zero << x); // expected-warning {{The left operand to '<<' is always 0}} 523e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(zero >> x); // expected-warning {{The left operand to '>>' is always 0}} 53245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care 54db34ab70961ca4b24b600eb47053d7af304659f5Tom Care // Overwrite the values so these aren't marked as Pseudoconstants 55245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care x = 1; 56245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care zero = 2; 57245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care one = 3; 58245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care 59245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care return x + zero + one; 60db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care} 61453293109e670824d84e94c0c2891737e3261f1fTed Kremenek 62453293109e670824d84e94c0c2891737e3261f1fTed Kremenekvoid floats(float x) { 63a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care test_f(x * 1.0); // no-warning 64453293109e670824d84e94c0c2891737e3261f1fTed Kremenek test_f(x * 1.0F); // no-warning 65453293109e670824d84e94c0c2891737e3261f1fTed Kremenek} 66d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Care 67a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care// Ensure that we don't report false poitives in complex loops 68d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Carevoid bailout() { 69a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care int unused = 0, result = 4; 70a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care result = result; // expected-warning {{Assigned value is always the same as the existing value}} 71d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Care 72a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care for (unsigned bg = 0; bg < 1024; bg ++) { 73a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care result = bg * result; // no-warning 74d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Care 75d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Care for (int i = 0; i < 256; i++) { 76a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care unused *= i; // no-warning 77d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Care } 78d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Care } 79d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Care} 80a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care 816d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care// Relaxed liveness - check that we don't kill liveness at assignments 826d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Caretypedef unsigned uintptr_t; 836d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Carevoid kill_at_assign() { 846d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care short array[2]; 85ade3195a201e16e989e9f93a568fb1806519077cTed Kremenek uintptr_t x = (uintptr_t) array; 86ade3195a201e16e989e9f93a568fb1806519077cTed Kremenek short *p = (short *) x; 876d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care 886d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care // The following branch should be infeasible. 896d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care if (!(p = &array[0])) { // expected-warning{{Assigned value is always the same as the existing value}} 906d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care p = 0; 916d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care *p = 1; // no-warning 926d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care } 936d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care} 946d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care 95a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care// False positive tests 96a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care 97a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Careunsigned false1() { 9850e8ac2369951d200e0d3849465d481f20fbdb62Tom Care int a = 10; 9950e8ac2369951d200e0d3849465d481f20fbdb62Tom Care return a * (5 - 2 - 3); // no-warning 100a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care} 101a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care 102a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Careenum testenum { enum1 = 0, enum2 }; 103a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Careunsigned false2() { 10450e8ac2369951d200e0d3849465d481f20fbdb62Tom Care int a = 1234; 10550e8ac2369951d200e0d3849465d481f20fbdb62Tom Care return enum1 + a; // no-warning 106a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care} 107a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care 108ef52bcb606c73950139a775af61495f63fbc3603Tom Care// Self assignments of unused variables are common false positives 109ef52bcb606c73950139a775af61495f63fbc3603Tom Careunsigned false3(int param, int param2) { 110245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care param = param; // no-warning 111245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care 112ef52bcb606c73950139a775af61495f63fbc3603Tom Care // if a self assigned variable is used later, then it should be reported still 113ef52bcb606c73950139a775af61495f63fbc3603Tom Care param2 = param2; // expected-warning{{Assigned value is always the same as the existing value}} 114ef52bcb606c73950139a775af61495f63fbc3603Tom Care 115245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care unsigned nonparam = 5; 116245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care 117245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care nonparam = nonparam; // expected-warning{{Assigned value is always the same as the existing value}} 118245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care 119ef52bcb606c73950139a775af61495f63fbc3603Tom Care return param2 + nonparam; 120245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care} 121245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care 122db34ab70961ca4b24b600eb47053d7af304659f5Tom Care// Pseudo-constants (vars only read) and constants should not be reported 123245adabd97c8c770c13935a9075f2243cc6f1d57Tom Careunsigned false4() { 124245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care // Trivial constant 125db34ab70961ca4b24b600eb47053d7af304659f5Tom Care const int height = 1; 126823894110e6f161a29450dbdea44ab987cfe16bbTom Care int c = 42; 127823894110e6f161a29450dbdea44ab987cfe16bbTom Care test(height * c); // no-warning 128db34ab70961ca4b24b600eb47053d7af304659f5Tom Care 129823894110e6f161a29450dbdea44ab987cfe16bbTom Care // Pseudo-constant (never changes after decl) 130823894110e6f161a29450dbdea44ab987cfe16bbTom Care int width = height; 131823894110e6f161a29450dbdea44ab987cfe16bbTom Care 132245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care return width * 10; // no-warning 133245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care} 134db34ab70961ca4b24b600eb47053d7af304659f5Tom Care 135967fea6cd9ae60ea31d27d440967990d2c705729Tom Care// Block pseudoconstants 136967fea6cd9ae60ea31d27d440967990d2c705729Tom Carevoid false4a() { 137967fea6cd9ae60ea31d27d440967990d2c705729Tom Care // Pseudo-constant 138967fea6cd9ae60ea31d27d440967990d2c705729Tom Care __block int a = 1; 139967fea6cd9ae60ea31d27d440967990d2c705729Tom Care int b = 10; 140967fea6cd9ae60ea31d27d440967990d2c705729Tom Care __block int c = 0; 141967fea6cd9ae60ea31d27d440967990d2c705729Tom Care b *= a; // no-warning 142967fea6cd9ae60ea31d27d440967990d2c705729Tom Care 143967fea6cd9ae60ea31d27d440967990d2c705729Tom Care ^{ 144967fea6cd9ae60ea31d27d440967990d2c705729Tom Care // Psuedoconstant block var 145967fea6cd9ae60ea31d27d440967990d2c705729Tom Care test(b * c); // no-warning 146967fea6cd9ae60ea31d27d440967990d2c705729Tom Care 147967fea6cd9ae60ea31d27d440967990d2c705729Tom Care // Non-pseudoconstant block var 148967fea6cd9ae60ea31d27d440967990d2c705729Tom Care int d = 0; 149967fea6cd9ae60ea31d27d440967990d2c705729Tom Care test(b * d); // expected-warning{{The right operand to '*' is always 0}} 150967fea6cd9ae60ea31d27d440967990d2c705729Tom Care d = 5; 151967fea6cd9ae60ea31d27d440967990d2c705729Tom Care test(d); 152967fea6cd9ae60ea31d27d440967990d2c705729Tom Care }(); 153967fea6cd9ae60ea31d27d440967990d2c705729Tom Care 154967fea6cd9ae60ea31d27d440967990d2c705729Tom Care test(a + b); 155967fea6cd9ae60ea31d27d440967990d2c705729Tom Care} 156967fea6cd9ae60ea31d27d440967990d2c705729Tom Care 157db34ab70961ca4b24b600eb47053d7af304659f5Tom Care// Static vars are common false positives 158db34ab70961ca4b24b600eb47053d7af304659f5Tom Careint false5() { 159db34ab70961ca4b24b600eb47053d7af304659f5Tom Care static int test = 0; 160db34ab70961ca4b24b600eb47053d7af304659f5Tom Care int a = 56; 161db34ab70961ca4b24b600eb47053d7af304659f5Tom Care a *= test; // no-warning 162db34ab70961ca4b24b600eb47053d7af304659f5Tom Care test++; 163db34ab70961ca4b24b600eb47053d7af304659f5Tom Care return a; 164db34ab70961ca4b24b600eb47053d7af304659f5Tom Care} 165db34ab70961ca4b24b600eb47053d7af304659f5Tom Care 166db34ab70961ca4b24b600eb47053d7af304659f5Tom Care// Non-local storage vars are considered false positives 167db34ab70961ca4b24b600eb47053d7af304659f5Tom Careint globalInt = 1; 168db34ab70961ca4b24b600eb47053d7af304659f5Tom Careint false6() { 169db34ab70961ca4b24b600eb47053d7af304659f5Tom Care int localInt = 23; 170db34ab70961ca4b24b600eb47053d7af304659f5Tom Care 171db34ab70961ca4b24b600eb47053d7af304659f5Tom Care localInt /= globalInt; 172db34ab70961ca4b24b600eb47053d7af304659f5Tom Care 173db34ab70961ca4b24b600eb47053d7af304659f5Tom Care return localInt; 174db34ab70961ca4b24b600eb47053d7af304659f5Tom Care} 1756216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care 1766216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care// Check that assignments filter out false positives correctly 1776216dc0c5b9071b4c10f78718a64ca916c00a384Tom Careint false7() { 178fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner int zero = 0; // pseudo-constant 1796216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care int one = 1; 1806216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care 1816216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care int a = 55; 1826216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care a = a; // expected-warning{{Assigned value is always the same as the existing value}} 1836216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care a = enum1 * a; // no-warning 1846216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care 1856216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care int b = 123; 1866216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care b = b; // no-warning 1876216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care 1886216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care return a; 1896216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care} 19084c24ed29e0bb37fc06a584e0df5bdfbe49efc8fTom Care 19184c24ed29e0bb37fc06a584e0df5bdfbe49efc8fTom Care// Check truncations do not flag as self-assignments 19284c24ed29e0bb37fc06a584e0df5bdfbe49efc8fTom Carevoid false8() { 19384c24ed29e0bb37fc06a584e0df5bdfbe49efc8fTom Care int a = 10000000; 19484c24ed29e0bb37fc06a584e0df5bdfbe49efc8fTom Care a = (short)a; // no-warning 19584c24ed29e0bb37fc06a584e0df5bdfbe49efc8fTom Care test(a); 19684c24ed29e0bb37fc06a584e0df5bdfbe49efc8fTom Care} 19702282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek 19802282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek// This test case previously flagged a warning at 'b == c' because the 19902282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek// analyzer previously allowed 'UnknownVal' as the index for ElementRegions. 20002282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenektypedef struct RDar8431728_F { 20102282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek int RDar8431728_A; 20202282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek unsigned char *RDar8431728_B; 20302282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek int RDar8431728_E[6]; 20402282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek} RDar8431728_D; 20502282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenekstatic inline int RDar8431728_C(RDar8431728_D * s, int n, 20602282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek unsigned char **RDar8431728_B_ptr) { 20702282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek int xy, wrap, pred, a, b, c; 20802282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek 20902282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek xy = s->RDar8431728_E[n]; 21002282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek wrap = s->RDar8431728_A; 21102282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek 21202282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek a = s->RDar8431728_B[xy - 1]; 21302282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek b = s->RDar8431728_B[xy - 1 - wrap]; 21402282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek c = s->RDar8431728_B[xy - wrap]; 21502282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek 21602282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek if (b == c) { // no-warning 21702282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek pred = a; 21802282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek } else { 21902282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek pred = c; 22002282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek } 22102282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek 22202282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek *RDar8431728_B_ptr = &s->RDar8431728_B[xy]; 22302282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek 22402282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek return pred; 22502282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek} 22602282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek 22774faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek// <rdar://problem/8601243> - Don't warn on pointer arithmetic. This 22874faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek// is often idiomatic. 22974faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenekunsigned rdar8601243_aux(unsigned n); 23074faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenekvoid rdar8601243() { 23174faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek char arr[100]; 23274faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek char *start = arr; 23374faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek start = start + rdar8601243_aux(sizeof(arr) - (arr - start)); // no-warning 23474faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek (void) start; 23574faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek} 23674faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek 237791dd0a3f855b61ee97387dca67af86a1edff9f2Jordan Rose 238791dd0a3f855b61ee97387dca67af86a1edff9f2Jordan Rosefloat testFloatCast(int i) { 239791dd0a3f855b61ee97387dca67af86a1edff9f2Jordan Rose float f = i; 240791dd0a3f855b61ee97387dca67af86a1edff9f2Jordan Rose 241791dd0a3f855b61ee97387dca67af86a1edff9f2Jordan Rose // Don't crash when trying to create a "zero" float. 242791dd0a3f855b61ee97387dca67af86a1edff9f2Jordan Rose return f - f; 243791dd0a3f855b61ee97387dca67af86a1edff9f2Jordan Rose} 244791dd0a3f855b61ee97387dca67af86a1edff9f2Jordan Rose 245