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