1ade3195a201e16e989e9f93a568fb1806519077cTed Kremenek// RUN: %clang_cc1 -analyze -analyzer-store=region -analyzer-constraints=range -fblocks -analyzer-opt-analyze-nested-blocks -analyzer-checker=deadcode.IdempotentOperations -verify %s 21659acb9f93bab0c3e56d0c0f504d2ba41d6403eArgyrios Kyrtzidis// RUN: %clang --analyze -Xclang -analyzer-disable-checker=deadcode.DeadStores -fblocks -Xclang -verify %s -o %t 3db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care 4db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care// Basic tests 5db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care 6db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Careextern void test(int i); 7453293109e670824d84e94c0c2891737e3261f1fTed Kremenekextern void test_f(float f); 8db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care 9245adabd97c8c770c13935a9075f2243cc6f1d57Tom Careunsigned basic() { 10db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care int x = 10, zero = 0, one = 1; 11db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care 12db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care // x op x 133e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek x = x; // expected-warning {{Assigned value is always the same as the existing value}} 143e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(x - x); // expected-warning {{Both operands to '-' always have the same value}} 153e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek x -= x; // expected-warning {{Both operands to '-=' always have the same value}} 16db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care x = 10; // no-warning 173e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(x / x); // expected-warning {{Both operands to '/' always have the same value}} 183e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek x /= x; // expected-warning {{Both operands to '/=' always have the same value}} 19db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care x = 10; // no-warning 203e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(x & x); // expected-warning {{Both operands to '&' always have the same value}} 213e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek x &= x; // expected-warning {{Both operands to '&=' always have the same value}} 223e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(x | x); // expected-warning {{Both operands to '|' always have the same value}} 233e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek x |= x; // expected-warning {{Both operands to '|=' always have the same value}} 24db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care 25db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care // x op 1 263e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(x * one); // expected-warning {{The right operand to '*' is always 1}} 273e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek x *= one; // expected-warning {{The right operand to '*=' is always 1}} 283e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(x / one); // expected-warning {{The right operand to '/' is always 1}} 293e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek x /= one; // expected-warning {{The right operand to '/=' is always 1}} 30db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care 31db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care // 1 op x 323e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(one * x); // expected-warning {{The left operand to '*' is always 1}} 33db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care 34db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care // x op 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}} 423e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(x >> zero); // expected-warning {{The right operand to '>>' is always 0}} 43db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care 44db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care // 0 op x 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}} 533e5637f8a1c5b3cc3fa9d4e33a5763883ea97fc6Ted Kremenek test(zero >> x); // expected-warning {{The left operand to '>>' is always 0}} 54245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care 55db34ab70961ca4b24b600eb47053d7af304659f5Tom Care // Overwrite the values so these aren't marked as Pseudoconstants 56245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care x = 1; 57245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care zero = 2; 58245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care one = 3; 59245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care 60245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care return x + zero + one; 61db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care} 62453293109e670824d84e94c0c2891737e3261f1fTed Kremenek 63453293109e670824d84e94c0c2891737e3261f1fTed Kremenekvoid floats(float x) { 64a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care test_f(x * 1.0); // no-warning 65453293109e670824d84e94c0c2891737e3261f1fTed Kremenek test_f(x * 1.0F); // no-warning 66453293109e670824d84e94c0c2891737e3261f1fTed Kremenek} 67d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Care 68a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care// Ensure that we don't report false poitives in complex loops 69d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Carevoid bailout() { 70a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care int unused = 0, result = 4; 71a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care result = result; // expected-warning {{Assigned value is always the same as the existing value}} 72d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Care 73a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care for (unsigned bg = 0; bg < 1024; bg ++) { 74a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care result = bg * result; // no-warning 75d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Care 76d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Care for (int i = 0; i < 256; i++) { 77a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care unused *= i; // no-warning 78d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Care } 79d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Care } 80d85770b4ef71cf9168deb9a73f6a97d5cff1db29Tom Care} 81a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care 826d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care// Relaxed liveness - check that we don't kill liveness at assignments 836d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Caretypedef unsigned uintptr_t; 846d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Carevoid kill_at_assign() { 856d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care short array[2]; 86ade3195a201e16e989e9f93a568fb1806519077cTed Kremenek uintptr_t x = (uintptr_t) array; 87ade3195a201e16e989e9f93a568fb1806519077cTed Kremenek short *p = (short *) x; 886d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care 896d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care // The following branch should be infeasible. 906d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care if (!(p = &array[0])) { // expected-warning{{Assigned value is always the same as the existing value}} 916d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care p = 0; 926d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care *p = 1; // no-warning 936d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care } 946d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care} 956d0e6ce200aa06b06f0e9b493ed365bbe2982ceeTom Care 96a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care// False positive tests 97a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care 98a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Careunsigned false1() { 9950e8ac2369951d200e0d3849465d481f20fbdb62Tom Care int a = 10; 10050e8ac2369951d200e0d3849465d481f20fbdb62Tom Care return a * (5 - 2 - 3); // no-warning 101a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care} 102a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care 103a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Careenum testenum { enum1 = 0, enum2 }; 104a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Careunsigned false2() { 10550e8ac2369951d200e0d3849465d481f20fbdb62Tom Care int a = 1234; 10650e8ac2369951d200e0d3849465d481f20fbdb62Tom Care return enum1 + a; // no-warning 107a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care} 108a7a8a450d908b34fa5f569f2e694ebd4b61aae2fTom Care 109ef52bcb606c73950139a775af61495f63fbc3603Tom Care// Self assignments of unused variables are common false positives 110ef52bcb606c73950139a775af61495f63fbc3603Tom Careunsigned false3(int param, int param2) { 111245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care param = param; // no-warning 112245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care 113ef52bcb606c73950139a775af61495f63fbc3603Tom Care // if a self assigned variable is used later, then it should be reported still 114ef52bcb606c73950139a775af61495f63fbc3603Tom Care param2 = param2; // expected-warning{{Assigned value is always the same as the existing value}} 115ef52bcb606c73950139a775af61495f63fbc3603Tom Care 116245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care unsigned nonparam = 5; 117245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care 118245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care nonparam = nonparam; // expected-warning{{Assigned value is always the same as the existing value}} 119245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care 120ef52bcb606c73950139a775af61495f63fbc3603Tom Care return param2 + nonparam; 121245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care} 122245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care 123db34ab70961ca4b24b600eb47053d7af304659f5Tom Care// Pseudo-constants (vars only read) and constants should not be reported 124245adabd97c8c770c13935a9075f2243cc6f1d57Tom Careunsigned false4() { 125245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care // Trivial constant 126db34ab70961ca4b24b600eb47053d7af304659f5Tom Care const int height = 1; 127823894110e6f161a29450dbdea44ab987cfe16bbTom Care int c = 42; 128823894110e6f161a29450dbdea44ab987cfe16bbTom Care test(height * c); // no-warning 129db34ab70961ca4b24b600eb47053d7af304659f5Tom Care 130823894110e6f161a29450dbdea44ab987cfe16bbTom Care // Pseudo-constant (never changes after decl) 131823894110e6f161a29450dbdea44ab987cfe16bbTom Care int width = height; 132823894110e6f161a29450dbdea44ab987cfe16bbTom Care 133245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care return width * 10; // no-warning 134245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care} 135db34ab70961ca4b24b600eb47053d7af304659f5Tom Care 136967fea6cd9ae60ea31d27d440967990d2c705729Tom Care// Block pseudoconstants 137967fea6cd9ae60ea31d27d440967990d2c705729Tom Carevoid false4a() { 138967fea6cd9ae60ea31d27d440967990d2c705729Tom Care // Pseudo-constant 139967fea6cd9ae60ea31d27d440967990d2c705729Tom Care __block int a = 1; 140967fea6cd9ae60ea31d27d440967990d2c705729Tom Care int b = 10; 141967fea6cd9ae60ea31d27d440967990d2c705729Tom Care __block int c = 0; 142967fea6cd9ae60ea31d27d440967990d2c705729Tom Care b *= a; // no-warning 143967fea6cd9ae60ea31d27d440967990d2c705729Tom Care 144967fea6cd9ae60ea31d27d440967990d2c705729Tom Care ^{ 145967fea6cd9ae60ea31d27d440967990d2c705729Tom Care // Psuedoconstant block var 146967fea6cd9ae60ea31d27d440967990d2c705729Tom Care test(b * c); // no-warning 147967fea6cd9ae60ea31d27d440967990d2c705729Tom Care 148967fea6cd9ae60ea31d27d440967990d2c705729Tom Care // Non-pseudoconstant block var 149967fea6cd9ae60ea31d27d440967990d2c705729Tom Care int d = 0; 150967fea6cd9ae60ea31d27d440967990d2c705729Tom Care test(b * d); // expected-warning{{The right operand to '*' is always 0}} 151967fea6cd9ae60ea31d27d440967990d2c705729Tom Care d = 5; 152967fea6cd9ae60ea31d27d440967990d2c705729Tom Care test(d); 153967fea6cd9ae60ea31d27d440967990d2c705729Tom Care }(); 154967fea6cd9ae60ea31d27d440967990d2c705729Tom Care 155967fea6cd9ae60ea31d27d440967990d2c705729Tom Care test(a + b); 156967fea6cd9ae60ea31d27d440967990d2c705729Tom Care} 157967fea6cd9ae60ea31d27d440967990d2c705729Tom Care 158db34ab70961ca4b24b600eb47053d7af304659f5Tom Care// Static vars are common false positives 159db34ab70961ca4b24b600eb47053d7af304659f5Tom Careint false5() { 160db34ab70961ca4b24b600eb47053d7af304659f5Tom Care static int test = 0; 161db34ab70961ca4b24b600eb47053d7af304659f5Tom Care int a = 56; 162db34ab70961ca4b24b600eb47053d7af304659f5Tom Care a *= test; // no-warning 163db34ab70961ca4b24b600eb47053d7af304659f5Tom Care test++; 164db34ab70961ca4b24b600eb47053d7af304659f5Tom Care return a; 165db34ab70961ca4b24b600eb47053d7af304659f5Tom Care} 166db34ab70961ca4b24b600eb47053d7af304659f5Tom Care 167db34ab70961ca4b24b600eb47053d7af304659f5Tom Care// Non-local storage vars are considered false positives 168db34ab70961ca4b24b600eb47053d7af304659f5Tom Careint globalInt = 1; 169db34ab70961ca4b24b600eb47053d7af304659f5Tom Careint false6() { 170db34ab70961ca4b24b600eb47053d7af304659f5Tom Care int localInt = 23; 171db34ab70961ca4b24b600eb47053d7af304659f5Tom Care 172db34ab70961ca4b24b600eb47053d7af304659f5Tom Care localInt /= globalInt; 173db34ab70961ca4b24b600eb47053d7af304659f5Tom Care 174db34ab70961ca4b24b600eb47053d7af304659f5Tom Care return localInt; 175db34ab70961ca4b24b600eb47053d7af304659f5Tom Care} 1766216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care 1776216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care// Check that assignments filter out false positives correctly 1786216dc0c5b9071b4c10f78718a64ca916c00a384Tom Careint false7() { 179fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner int zero = 0; // pseudo-constant 1806216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care int one = 1; 1816216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care 1826216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care int a = 55; 1836216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care a = a; // expected-warning{{Assigned value is always the same as the existing value}} 1846216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care a = enum1 * a; // no-warning 1856216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care 1866216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care int b = 123; 1876216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care b = b; // no-warning 1886216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care 1896216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care return a; 1906216dc0c5b9071b4c10f78718a64ca916c00a384Tom Care} 19184c24ed29e0bb37fc06a584e0df5bdfbe49efc8fTom Care 19284c24ed29e0bb37fc06a584e0df5bdfbe49efc8fTom Care// Check truncations do not flag as self-assignments 19384c24ed29e0bb37fc06a584e0df5bdfbe49efc8fTom Carevoid false8() { 19484c24ed29e0bb37fc06a584e0df5bdfbe49efc8fTom Care int a = 10000000; 19584c24ed29e0bb37fc06a584e0df5bdfbe49efc8fTom Care a = (short)a; // no-warning 19684c24ed29e0bb37fc06a584e0df5bdfbe49efc8fTom Care test(a); 19784c24ed29e0bb37fc06a584e0df5bdfbe49efc8fTom Care} 19802282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek 19902282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek// This test case previously flagged a warning at 'b == c' because the 20002282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek// analyzer previously allowed 'UnknownVal' as the index for ElementRegions. 20102282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenektypedef struct RDar8431728_F { 20202282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek int RDar8431728_A; 20302282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek unsigned char *RDar8431728_B; 20402282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek int RDar8431728_E[6]; 20502282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek} RDar8431728_D; 20602282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenekstatic inline int RDar8431728_C(RDar8431728_D * s, int n, 20702282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek unsigned char **RDar8431728_B_ptr) { 20802282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek int xy, wrap, pred, a, b, c; 20902282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek 21002282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek xy = s->RDar8431728_E[n]; 21102282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek wrap = s->RDar8431728_A; 21202282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek 21302282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek a = s->RDar8431728_B[xy - 1]; 21402282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek b = s->RDar8431728_B[xy - 1 - wrap]; 21502282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek c = s->RDar8431728_B[xy - wrap]; 21602282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek 21702282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek if (b == c) { // no-warning 21802282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek pred = a; 21902282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek } else { 22002282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek pred = c; 22102282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek } 22202282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek 22302282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek *RDar8431728_B_ptr = &s->RDar8431728_B[xy]; 22402282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek 22502282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek return pred; 22602282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek} 22702282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek 22874faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek// <rdar://problem/8601243> - Don't warn on pointer arithmetic. This 22974faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek// is often idiomatic. 23074faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenekunsigned rdar8601243_aux(unsigned n); 23174faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenekvoid rdar8601243() { 23274faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek char arr[100]; 23374faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek char *start = arr; 23474faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek start = start + rdar8601243_aux(sizeof(arr) - (arr - start)); // no-warning 23574faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek (void) start; 23674faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek} 23774faec22ec84c54bcbd82cb6c48b72cb466b945fTed Kremenek 238