Tweak the retain/release checker to not stop tracking retained objects when calling C++ methods. This is a temporary solution to prune false positives until we have a general story using annotations.

llvm-svn: 130726
This commit is contained in:
Ted Kremenek 2011-05-02 21:21:42 +00:00
parent d5c45f6738
commit e9f364f658
2 changed files with 29 additions and 0 deletions

View File

@ -930,6 +930,13 @@ RetainSummary* RetainSummaryManager::getSummary(const FunctionDecl* FD) {
S = getPersistentStopSummary();
break;
}
// For C++ methods, generate an implicit "stop" summary as well. We
// can relax this once we have a clear policy for C++ methods and
// ownership attributes.
if (isa<CXXMethodDecl>(FD)) {
S = getPersistentStopSummary();
break;
}
// [PR 3337] Use 'getAs<FunctionType>' to strip away any typedefs on the
// function's type.

View File

@ -275,10 +275,32 @@ class SmartPointer {
public:
SmartPointer(id x) : x(x) {}
~SmartPointer() { [x release]; }
void adopt(id x);
void noAdopt(id x);
};
void test_positive() {
id x = [[NSObject alloc] init]; // expected-warning {{leak}}
}
void test_smartpointer_1() {
id x = [[NSObject alloc] init]; // no-warning
SmartPointer foo(x);
}
void test_smartpointer_2() {
id x = [[NSObject alloc] init]; // no-warning
SmartPointer foo(0);
foo.adopt(x);
}
// FIXME: Eventually we want annotations to say whether or not
// a C++ method claims ownership of an Objective-C object.
void test_smartpointer_3() {
id x = [[NSObject alloc] init]; // no-warning
SmartPointer foo(0);
foo.noAdopt(x);
}