1b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-config suppress-null-return-paths=false -verify %s
26a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose// RUN: %clang_cc1 -analyze -analyzer-checker=core -verify -DSUPPRESSED=1 %s
36a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-config avoid-suppressing-null-argument-paths=true -DSUPPRESSED=1 -DNULL_ARGS=1 -verify %s
4b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
5b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Roseint opaquePropertyCheck(void *object);
6b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Roseint coin();
7b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
86a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Roseint *getNull() {
96a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  return 0;
106a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose}
116a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose
12c1bef5671e682de5a573c7c6b66871b36de0ec61Anna Zaksint* getPtr();
13c1bef5671e682de5a573c7c6b66871b36de0ec61Anna Zaks
14b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Roseint *dynCastToInt(void *ptr) {
15b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  if (opaquePropertyCheck(ptr))
16b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose    return (int *)ptr;
17b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  return 0;
18b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose}
19b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
20b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Roseint *dynCastOrNull(void *ptr) {
21b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  if (!ptr)
22b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose    return 0;
23b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  if (opaquePropertyCheck(ptr))
24b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose    return (int *)ptr;
25b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  return 0;
26b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose}
27b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
28b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
29b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rosevoid testDynCast(void *p) {
30b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  int *casted = dynCastToInt(p);
31b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  *casted = 1;
32b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose#ifndef SUPPRESSED
33b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  // expected-warning@-2 {{Dereference of null pointer}}
34b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose#endif
35b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose}
36b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
37b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rosevoid testDynCastOrNull(void *p) {
38b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  int *casted = dynCastOrNull(p);
39b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  *casted = 1;
40b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose#ifndef SUPPRESSED
41b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  // expected-warning@-2 {{Dereference of null pointer}}
42b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose#endif
43b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose}
44b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
45b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
46b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rosevoid testBranch(void *p) {
47b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  int *casted;
48b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
49b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  // Although the report will be suppressed on one branch, it should still be
50b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  // valid on the other.
51b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  if (coin()) {
52b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose    casted = dynCastToInt(p);
53b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  } else {
54b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose    if (p)
55b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose      return;
56b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose    casted = (int *)p;
57b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  }
58b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
59b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  *casted = 1; // expected-warning {{Dereference of null pointer}}
60b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose}
61b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
62b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rosevoid testBranchReversed(void *p) {
63b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  int *casted;
64b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
65b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  // Although the report will be suppressed on one branch, it should still be
66b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  // valid on the other.
67b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  if (coin()) {
68b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose    if (p)
69b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose      return;
70b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose    casted = (int *)p;
71b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  } else {
72b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose    casted = dynCastToInt(p);
73b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  }
74b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
75b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  *casted = 1; // expected-warning {{Dereference of null pointer}}
76b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose}
77b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
786f4160828db75f36b22a204da202723c592644f3Jordan Rosevoid testMultipleStore(void *p) {
796f4160828db75f36b22a204da202723c592644f3Jordan Rose  int *casted = 0;
806f4160828db75f36b22a204da202723c592644f3Jordan Rose  casted = dynCastToInt(p);
816f4160828db75f36b22a204da202723c592644f3Jordan Rose  *casted = 1;
826f4160828db75f36b22a204da202723c592644f3Jordan Rose#ifndef SUPPRESSED
836f4160828db75f36b22a204da202723c592644f3Jordan Rose  // expected-warning@-2 {{Dereference of null pointer}}
846f4160828db75f36b22a204da202723c592644f3Jordan Rose#endif
856f4160828db75f36b22a204da202723c592644f3Jordan Rose}
866f4160828db75f36b22a204da202723c592644f3Jordan Rose
877f79b78351af03a392ee16d8ec557d47746c33c6Anna Zaks// Test that div by zero does not get suppressed. This is a policy choice.
887f79b78351af03a392ee16d8ec557d47746c33c6Anna Zaksint retZero() {
897f79b78351af03a392ee16d8ec557d47746c33c6Anna Zaks  return 0;
907f79b78351af03a392ee16d8ec557d47746c33c6Anna Zaks}
917f79b78351af03a392ee16d8ec557d47746c33c6Anna Zaksint triggerDivZero () {
927f79b78351af03a392ee16d8ec557d47746c33c6Anna Zaks  int y = retZero();
937f79b78351af03a392ee16d8ec557d47746c33c6Anna Zaks  return 5/y; // expected-warning {{Division by zero}}
947f79b78351af03a392ee16d8ec557d47746c33c6Anna Zaks}
95b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
966a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose// --------------------------
976a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose// "Suppression suppression"
986a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose// --------------------------
996a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose
1006a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rosevoid testDynCastOrNullOfNull() {
1016a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  // Don't suppress when one of the arguments is NULL.
1026a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  int *casted = dynCastOrNull(0);
1036a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  *casted = 1;
1046a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose#if !SUPPRESSED || NULL_ARGS
1056a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  // expected-warning@-2 {{Dereference of null pointer}}
1066a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose#endif
1076a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose}
1086a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose
1096a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rosevoid testDynCastOfNull() {
1106a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  // Don't suppress when one of the arguments is NULL.
1116a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  int *casted = dynCastToInt(0);
1126a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  *casted = 1;
1136a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose#if !SUPPRESSED || NULL_ARGS
1146a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  // expected-warning@-2 {{Dereference of null pointer}}
1156a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose#endif
1166a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose}
1176a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose
1186a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Roseint *lookUpInt(int unused) {
1196a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  if (coin())
1206a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose    return 0;
1216a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  static int x;
1226a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  return &x;
1236a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose}
1246a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose
1256a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rosevoid testZeroIsNotNull() {
1266a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  // /Do/ suppress when the argument is 0 (an integer).
1276a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  int *casted = lookUpInt(0);
1286a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  *casted = 1;
1296a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose#ifndef SUPPRESSED
1306a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  // expected-warning@-2 {{Dereference of null pointer}}
1316a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose#endif
1326a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose}
1336a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose
1346a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rosevoid testTrackNull() {
1356a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  // /Do/ suppress if the null argument came from another call returning null.
1366a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  int *casted = dynCastOrNull(getNull());
1376a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  *casted = 1;
1386a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose#ifndef SUPPRESSED
1396a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  // expected-warning@-2 {{Dereference of null pointer}}
1406a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose#endif
1416a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose}
1426a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose
1436a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rosevoid testTrackNullVariable() {
1446a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  // /Do/ suppress if the null argument came from another call returning null.
1456a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  int *ptr;
1466a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  ptr = getNull();
1476a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  int *casted = dynCastOrNull(ptr);
1486a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  *casted = 1;
1496a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose#ifndef SUPPRESSED
1506a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  // expected-warning@-2 {{Dereference of null pointer}}
1516a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose#endif
1526a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose}
1536a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose
1542faee99ab67105e834d11df7db80a78a3e3ed37bJordan Rosevoid inlinedIsDifferent(int inlined) {
1552faee99ab67105e834d11df7db80a78a3e3ed37bJordan Rose  int i;
1562faee99ab67105e834d11df7db80a78a3e3ed37bJordan Rose
1572faee99ab67105e834d11df7db80a78a3e3ed37bJordan Rose  // We were erroneously picking up the inner stack frame's initialization,
1582faee99ab67105e834d11df7db80a78a3e3ed37bJordan Rose  // even though the error occurs in the outer stack frame!
1592faee99ab67105e834d11df7db80a78a3e3ed37bJordan Rose  int *p = inlined ? &i : getNull();
1602faee99ab67105e834d11df7db80a78a3e3ed37bJordan Rose
1612faee99ab67105e834d11df7db80a78a3e3ed37bJordan Rose  if (!inlined)
1622faee99ab67105e834d11df7db80a78a3e3ed37bJordan Rose    inlinedIsDifferent(1);
1632faee99ab67105e834d11df7db80a78a3e3ed37bJordan Rose
1642faee99ab67105e834d11df7db80a78a3e3ed37bJordan Rose  *p = 1;
1652faee99ab67105e834d11df7db80a78a3e3ed37bJordan Rose#ifndef SUPPRESSED
1662faee99ab67105e834d11df7db80a78a3e3ed37bJordan Rose  // expected-warning@-2 {{Dereference of null pointer}}
1672faee99ab67105e834d11df7db80a78a3e3ed37bJordan Rose#endif
1682faee99ab67105e834d11df7db80a78a3e3ed37bJordan Rose}
1692faee99ab67105e834d11df7db80a78a3e3ed37bJordan Rose
1702faee99ab67105e834d11df7db80a78a3e3ed37bJordan Rosevoid testInlinedIsDifferent() {
1712faee99ab67105e834d11df7db80a78a3e3ed37bJordan Rose  // <rdar://problem/13787723>
1722faee99ab67105e834d11df7db80a78a3e3ed37bJordan Rose  inlinedIsDifferent(0);
1732faee99ab67105e834d11df7db80a78a3e3ed37bJordan Rose}
1742faee99ab67105e834d11df7db80a78a3e3ed37bJordan Rose
1756a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose
176b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose// ---------------------------------------
177b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose// FALSE NEGATIVES (over-suppression)
178b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose// ---------------------------------------
179b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
1806a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rosevoid testNoArguments() {
1816a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  // In this case the function has no branches, and MUST return null.
1826a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  int *casted = getNull();
1836a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  *casted = 1;
1846a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose#ifndef SUPPRESSED
1856a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  // expected-warning@-2 {{Dereference of null pointer}}
1866a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose#endif
1876a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose}
1886a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose
1896a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Roseint *getNullIfNonNull(void *input) {
1906a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  if (input)
1916a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose    return 0;
1926a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  static int x;
1936a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  return &x;
1946a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose}
1956a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose
1966a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rosevoid testKnownPath(void *input) {
1976a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  if (!input)
1986a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose    return;
1996a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose
200b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  // In this case we have a known value for the argument, and thus the path
201b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  // through the function doesn't ever split.
2026a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  int *casted = getNullIfNonNull(input);
203b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  *casted = 1;
204b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose#ifndef SUPPRESSED
205b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  // expected-warning@-2 {{Dereference of null pointer}}
206b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose#endif
207b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose}
208b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
2096a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Roseint *alwaysReturnNull(void *input) {
2106a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  if (opaquePropertyCheck(input))
2116a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose    return 0;
2126a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  return 0;
2136a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose}
2146a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose
2156a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rosevoid testAlwaysReturnNull(void *input) {
216b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  // In this case all paths out of the function return 0, but they are all
217b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  // dominated by a branch whose condition we don't know!
2186a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  int *casted = alwaysReturnNull(input);
219b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  *casted = 1;
220b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose#ifndef SUPPRESSED
221b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  // expected-warning@-2 {{Dereference of null pointer}}
222b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose#endif
223b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose}
224b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
225dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaksint derefArg(int *p) {
226dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks	return *p;
227dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks#ifndef SUPPRESSED
228dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks  // expected-warning@-2 {{Dereference of null pointer}}
229dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks#endif
230dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks}
231dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaksvoid ternaryArg(char cond) {
232dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks	static int x;
233dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks	derefArg(cond ? &x : getNull());
234dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks}
235dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks
236f510f5cd57fa9b7ea6f6e103c65c0df95a55d986Anna Zaksint derefArgCast(char *p) {
237f510f5cd57fa9b7ea6f6e103c65c0df95a55d986Anna Zaks	return *p;
238f510f5cd57fa9b7ea6f6e103c65c0df95a55d986Anna Zaks#ifndef SUPPRESSED
239f510f5cd57fa9b7ea6f6e103c65c0df95a55d986Anna Zaks  // expected-warning@-2 {{Dereference of null pointer}}
240f510f5cd57fa9b7ea6f6e103c65c0df95a55d986Anna Zaks#endif
241f510f5cd57fa9b7ea6f6e103c65c0df95a55d986Anna Zaks}
242f510f5cd57fa9b7ea6f6e103c65c0df95a55d986Anna Zaksvoid ternaryArgCast(char cond) {
243f510f5cd57fa9b7ea6f6e103c65c0df95a55d986Anna Zaks	static int x;
244f510f5cd57fa9b7ea6f6e103c65c0df95a55d986Anna Zaks	derefArgCast((char*)((unsigned)cond ? &x : getNull()));
245f510f5cd57fa9b7ea6f6e103c65c0df95a55d986Anna Zaks}
246f510f5cd57fa9b7ea6f6e103c65c0df95a55d986Anna Zaks
247dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaksint derefAssignment(int *p) {
248dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks	return *p;
249dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks#ifndef SUPPRESSED
250dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks  // expected-warning@-2 {{Dereference of null pointer}}
251dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks#endif
252dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks}
253c1bef5671e682de5a573c7c6b66871b36de0ec61Anna Zaks
254dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaksvoid ternaryAssignment(char cond) {
255dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks  static int x;
256c1bef5671e682de5a573c7c6b66871b36de0ec61Anna Zaks  int *p = cond ? getNull() : getPtr();
257dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks  derefAssignment(p);
258dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks}
259dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks
260dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaksint *retNull(char cond) {
261dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks  static int x;
262dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks  return cond ? &x : getNull();
263dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks}
264dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaksint ternaryRetNull(char cond) {
265dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks  int *p = retNull(cond);
266dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks  return *p;
267dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks#ifndef SUPPRESSED
268dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks  // expected-warning@-2 {{Dereference of null pointer}}
269dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks#endif
270dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks}
271dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks
272cabc3fddae63f5eb3bd44bdecce7a3fbd69421a9Anna Zaks// Test suppression of nested conditional operators.
273cabc3fddae63f5eb3bd44bdecce7a3fbd69421a9Anna Zaksint testConditionalOperatorSuppress(int x) {
274cabc3fddae63f5eb3bd44bdecce7a3fbd69421a9Anna Zaks  return *(x ? getNull() : getPtr());
275cabc3fddae63f5eb3bd44bdecce7a3fbd69421a9Anna Zaks#ifndef SUPPRESSED
276cabc3fddae63f5eb3bd44bdecce7a3fbd69421a9Anna Zaks  // expected-warning@-2 {{Dereference of null pointer}}
277cabc3fddae63f5eb3bd44bdecce7a3fbd69421a9Anna Zaks#endif
278cabc3fddae63f5eb3bd44bdecce7a3fbd69421a9Anna Zaks}
279cabc3fddae63f5eb3bd44bdecce7a3fbd69421a9Anna Zaksint testNestedConditionalOperatorSuppress(int x) {
280cabc3fddae63f5eb3bd44bdecce7a3fbd69421a9Anna Zaks  return *(x ? (x ? getNull() : getPtr()) : getPtr());
281cabc3fddae63f5eb3bd44bdecce7a3fbd69421a9Anna Zaks#ifndef SUPPRESSED
282cabc3fddae63f5eb3bd44bdecce7a3fbd69421a9Anna Zaks  // expected-warning@-2 {{Dereference of null pointer}}
283cabc3fddae63f5eb3bd44bdecce7a3fbd69421a9Anna Zaks#endif
284cabc3fddae63f5eb3bd44bdecce7a3fbd69421a9Anna Zaks}
285cabc3fddae63f5eb3bd44bdecce7a3fbd69421a9Anna Zaksint testConditionalOperator(int x) {
286cabc3fddae63f5eb3bd44bdecce7a3fbd69421a9Anna Zaks  return *(x ? 0 : getPtr()); // expected-warning {{Dereference of null pointer}}
287cabc3fddae63f5eb3bd44bdecce7a3fbd69421a9Anna Zaks}
288cabc3fddae63f5eb3bd44bdecce7a3fbd69421a9Anna Zaksint testNestedConditionalOperator(int x) {
289cabc3fddae63f5eb3bd44bdecce7a3fbd69421a9Anna Zaks  return *(x ? (x ? 0 : getPtr()) : getPtr()); // expected-warning {{Dereference of null pointer}}
290cabc3fddae63f5eb3bd44bdecce7a3fbd69421a9Anna Zaks}
291cabc3fddae63f5eb3bd44bdecce7a3fbd69421a9Anna Zaks
292cabc3fddae63f5eb3bd44bdecce7a3fbd69421a9Anna Zaksint testConditionalOperatorSuppressFloatCond(float x) {
293702077f14100f2d7acdb12ad49b53e64efc37d72Anna Zaks  return *(x ? getNull() : getPtr());
294702077f14100f2d7acdb12ad49b53e64efc37d72Anna Zaks#ifndef SUPPRESSED
295702077f14100f2d7acdb12ad49b53e64efc37d72Anna Zaks  // expected-warning@-2 {{Dereference of null pointer}}
296702077f14100f2d7acdb12ad49b53e64efc37d72Anna Zaks#endif
297cabc3fddae63f5eb3bd44bdecce7a3fbd69421a9Anna Zaks}
298dc9c160dede7e2f5cc11755db6aaa57e7fccbcecAnna Zaks
299