diff options
| author | Ted Kremenek <kremenek@apple.com> | 2012-05-08 00:12:09 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2012-05-08 00:12:09 +0000 |
| commit | ececf9f0ae6e117f554dff87a6bb6fd245ac380b (patch) | |
| tree | e4096ea0819ae7be3449f968b0ac58f66ab289c3 /clang | |
| parent | 952b4c11fe139c4c59fd318d279cb2cd2a96ccc1 (diff) | |
| download | bcm5719-llvm-ececf9f0ae6e117f554dff87a6bb6fd245ac380b.tar.gz bcm5719-llvm-ececf9f0ae6e117f554dff87a6bb6fd245ac380b.zip | |
Teach the static analyzer that NSLog() and friends do not hold on to object references (thus extending their lifetime).
llvm-svn: 156346
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp | 6 | ||||
| -rw-r--r-- | clang/test/Analysis/retain-release.m | 14 |
2 files changed, 20 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp index 325a7657e61..aa392b08608 100644 --- a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp @@ -648,6 +648,10 @@ public: return getPersistentSummary(Summ); } + const RetainSummary *getDoNothingSummary() { + return getPersistentSummary(RetEffect::MakeNoRet(), DoNothing, DoNothing); + } + const RetainSummary *getDefaultSummary() { return getPersistentSummary(RetEffect::MakeNoRet(), DoNothing, MayEscape); @@ -997,6 +1001,8 @@ RetainSummaryManager::getSummary(const FunctionDecl *FD, // libdispatch finalizers. ScratchArgs = AF.add(ScratchArgs, 1, StopTracking); S = getPersistentSummary(RetEffect::MakeNoRet(), DoNothing, DoNothing); + } else if (FName.startswith("NSLog")) { + S = getDoNothingSummary(); } else if (FName.startswith("NS") && (FName.find("Insert") != StringRef::npos)) { // Whitelist NSXXInsertXX, for example NSMapInsertIfAbsent, since they can diff --git a/clang/test/Analysis/retain-release.m b/clang/test/Analysis/retain-release.m index fb89cc81145..5422b8bb0fa 100644 --- a/clang/test/Analysis/retain-release.m +++ b/clang/test/Analysis/retain-release.m @@ -1784,3 +1784,17 @@ void test_objc_arrays() { } } +// Test NSLog doesn't escape tracked objects. +void rdar11400885(int y) +{ + @autoreleasepool { + NSString *printString; + if(y > 2) + printString = [[NSString alloc] init]; + else + printString = [[NSString alloc] init]; + NSLog(@"Once %@", printString); + [printString release]; + NSLog(@"Again: %@", printString); // expected-warning {{Reference-counted object is used after it is released}} + } +} |

