diff options
| author | Ted Kremenek <kremenek@apple.com> | 2009-02-05 22:34:53 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2009-02-05 22:34:53 +0000 |
| commit | 0ca23d3f730ad116ff0d151ec414f9a4caebea20 (patch) | |
| tree | 40e00113d8efc9a1e40b303fea3b66f65dce51c1 /clang | |
| parent | 2599084ac5f7862818125d67fb4be6586d081cbd (diff) | |
| download | bcm5719-llvm-0ca23d3f730ad116ff0d151ec414f9a4caebea20.tar.gz bcm5719-llvm-0ca23d3f730ad116ff0d151ec414f9a4caebea20.zip | |
Add 'AppendValue' to the list of magic CF function names that cause a tracked object to escape. Fixes <rdar://problem/6560661>.
llvm-svn: 63891
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Analysis/CFRefCount.cpp | 3 | ||||
| -rw-r--r-- | clang/test/Analysis/rdar-6539791.c | 16 |
2 files changed, 18 insertions, 1 deletions
diff --git a/clang/lib/Analysis/CFRefCount.cpp b/clang/lib/Analysis/CFRefCount.cpp index 8ed6bb285c0..ee17a57e9fb 100644 --- a/clang/lib/Analysis/CFRefCount.cpp +++ b/clang/lib/Analysis/CFRefCount.cpp @@ -826,7 +826,8 @@ RetainSummary* RetainSummaryManager::getSummary(FunctionDecl* FD) { // ArgEffect E = (CStrInCStrNoCase(FName, "InsertValue") || CStrInCStrNoCase(FName, "AddValue") || - CStrInCStrNoCase(FName, "SetValue")) + CStrInCStrNoCase(FName, "SetValue") || + CStrInCStrNoCase(FName, "AppendValue")) ? MayEscape : DoNothing; S = getPersistentSummary(RetEffect::MakeNoRet(), DoNothing, E); diff --git a/clang/test/Analysis/rdar-6539791.c b/clang/test/Analysis/rdar-6539791.c index 0d0b675d945..75485b0b547 100644 --- a/clang/test/Analysis/rdar-6539791.c +++ b/clang/test/Analysis/rdar-6539791.c @@ -15,7 +15,11 @@ enum { kCFNumberSInt32Type = 3 }; CFMutableDictionaryRef CFDictionaryCreateMutable(CFAllocatorRef allocator, CFIndex capacity, const CFDictionaryKeyCallBacks *keyCallBacks, const CFDictionaryValueCallBacks *valueCallBacks); void CFDictionaryAddValue(CFMutableDictionaryRef theDict, const void *key, const void *value); void CFRelease(CFTypeRef cf); +CFTypeRef CFRetain(CFTypeRef cf); extern CFNumberRef CFNumberCreate(CFAllocatorRef allocator, CFNumberType theType, const void *valuePtr); +typedef const struct __CFArray * CFArrayRef; +typedef struct __CFArray * CFMutableArrayRef; +void CFArrayAppendValue(CFMutableArrayRef theArray, const void *value); void f(CFMutableDictionaryRef y, void* key, void* val_key) { CFMutableDictionaryRef x = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); @@ -29,3 +33,15 @@ void f(CFMutableDictionaryRef y, void* key, void* val_key) { CFDictionaryAddValue(y, val_key, value); // no-warning } } + +// <rdar://problem/6560661> +// Same issue, except with "AppendValue" functions. +void f2(CFMutableArrayRef x) { + signed z = 1; + CFNumberRef value = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &z); + // CFArrayAppendValue keeps a reference to value. + CFArrayAppendValue(x, value); + CFRelease(value); + CFRetain(value); + CFRelease(value); // no-warning +} |

