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