diff options
Diffstat (limited to 'clang/test/Analysis/osobject-retain-release.cpp')
| -rw-r--r-- | clang/test/Analysis/osobject-retain-release.cpp | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/clang/test/Analysis/osobject-retain-release.cpp b/clang/test/Analysis/osobject-retain-release.cpp index 6cd7eb6d9af..5f9e4b664b4 100644 --- a/clang/test/Analysis/osobject-retain-release.cpp +++ b/clang/test/Analysis/osobject-retain-release.cpp @@ -31,10 +31,12 @@ struct OSArray : public OSObject { static OSArray *withCapacity(unsigned int capacity); static void consumeArray(OS_CONSUME OSArray * array); - static OSArray* consumeArrayHasCode(OS_CONSUME OSArray * array) { - return nullptr; + static OSArray* consumeArrayHasCode(OS_CONSUME OSArray * array) { // expected-note{{Parameter 'array' starts at +1, as it is marked as consuming}} + return nullptr; // expected-warning{{Potential leak of an object of type 'OSArray'}} +// expected-note@-1{{Object leaked: allocated object of type 'OSArray' is not referenced later in this execution path and has a retain count of +1}} } + static OS_RETURNS_NOT_RETAINED OSArray *MaskedGetter(); static OS_RETURNS_RETAINED OSArray *getOoopsActuallyCreate(); @@ -58,6 +60,13 @@ bool test_meta_cast_no_leak(OSMetaClassBase *arg) { return arg && arg->metaCast("blah") != nullptr; } +static void consumedMismatch(OS_CONSUME OSObject *a, + OSObject *b) { // expected-note{{Parameter 'b' starts at +0}} + a->release(); + b->retain(); // expected-note{{Reference count incremented. The object now has a +1 retain count}} +} // expected-warning{{Potential leak of an object of type 'OSObject'}} +// expected-note@-1{{Object leaked: allocated object of type 'OSObject' is not referenced later in this execution path and has a retain count of +1}} + void escape(void *); void escape_with_source(void *p) {} bool coin(); @@ -632,6 +641,17 @@ void test_smart_ptr_no_leak() { obj->release(); } +OSObject *getRuleViolation() { + return new OSObject; // expected-warning{{Potential leak of an object of type 'OSObject'}} +// expected-note@-1{{Operator 'new' returns an OSObject of type 'OSObject' with a +1 retain count}} +// expected-note@-2{{Object leaked: allocated object of type 'OSObject' is returned from a function whose name ('getRuleViolation') starts with 'get'}} +} + +OSObject *createRuleViolation(OSObject *param) { // expected-note{{Parameter 'param' starts at +0}} + return param; // expected-warning{{Object with a +0 retain count returned to caller where a +1 (owning) retain count is expected}} + // expected-note@-1{{Object with a +0 retain count returned to caller where a +1 (owning) retain count is expected}} +} + void test_ostypealloc_correct_diagnostic_name() { OSArray *arr = OSTypeAlloc(OSArray); // expected-note{{Call to method 'OSMetaClass::alloc' returns an OSObject of type 'OSArray' with a +1 retain count}} arr->retain(); // expected-note{{Reference count incremented. The object now has a +2 retain count}} @@ -659,4 +679,3 @@ void test_tagged_retain_no_uaf() { obj->release(); obj->release(); } - |

