diff options
author | Ted Kremenek <kremenek@apple.com> | 2012-09-06 23:47:02 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2012-09-06 23:47:02 +0000 |
commit | 061707a86f20bf608758e7013df24bd1be12ffc6 (patch) | |
tree | 0c10f153a05dc91bf3e73307facfe070fbce78c3 | |
parent | 5601c9aac3bf7be5e1ea8a76149090933d2d3c78 (diff) |
Teach RetainCountChecker that CFPlugInInstanceCreate does not
return a CF object at all.
Fixes <rdar://problem/9566345>
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@163362 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp | 2 | ||||
-rw-r--r-- | test/Analysis/retain-release.m | 12 |
2 files changed, 14 insertions, 0 deletions
diff --git a/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp b/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp index e95ba52f69..5d10575d83 100644 --- a/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp @@ -1074,6 +1074,8 @@ RetainSummaryManager::getFunctionSummary(const FunctionDecl *FD) { // The headers on OS X 10.8 use cf_consumed/ns_returns_retained, // but we can fully model NSMakeCollectable ourselves. AllowAnnotations = false; + } else if (FName == "CFPlugInInstanceCreate") { + S = getPersistentSummary(RetEffect::MakeNoRet()); } else if (FName == "IOBSDNameMatching" || FName == "IOServiceMatching" || FName == "IOServiceNameMatching" || diff --git a/test/Analysis/retain-release.m b/test/Analysis/retain-release.m index 9d2aa756b2..3a9649c741 100644 --- a/test/Analysis/retain-release.m +++ b/test/Analysis/retain-release.m @@ -303,6 +303,10 @@ extern CGColorSpaceRef CGColorSpaceCreateDeviceRGB(void); // This is how NSMakeCollectable is declared in the OS X 10.8 headers. id NSMakeCollectable(CFTypeRef __attribute__((cf_consumed))) __attribute__((ns_returns_retained)); +typedef const struct __CFUUID * CFUUIDRef; + +extern +void *CFPlugInInstanceCreate(CFAllocatorRef allocator, CFUUIDRef factoryUUID, CFUUIDRef typeUUID); //===----------------------------------------------------------------------===// // Test cases. @@ -1907,3 +1911,11 @@ void test_custom_cf() { MyCFType x = CreateMyCFType(); // expected-warning {{leak of an object stored into 'x'}} } +//===----------------------------------------------------------------------===// +// Test calling CFPlugInInstanceCreate, which appears in CF but doesn't +// return a CF object. +//===----------------------------------------------------------------------===// + +void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) { + CFPlugInInstanceCreate(kCFAllocatorDefault, factoryUUID, typeUUID); // no-warning +} |