зеркало из https://github.com/microsoft/clang-1.git
Refine diagnostics for leaks reported when returning an object
via function/method with [CF,NS]_RETURNS_NOT_RETAINED. Fixes <rdar://problem/11379000>. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@163355 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
2827f5af01
Коммит
ec9f36ea83
|
@ -2262,21 +2262,29 @@ CFRefLeakReportVisitor::getEndPath(BugReporterContext &BRC,
|
|||
// objects. Only "copy", "alloc", "retain" and "new" transfer ownership
|
||||
// to the caller for NS objects.
|
||||
const Decl *D = &EndN->getCodeDecl();
|
||||
if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) {
|
||||
os << " is returned from a method whose name ('"
|
||||
<< MD->getSelector().getAsString()
|
||||
<< "') does not start with 'copy', 'mutableCopy', 'alloc' or 'new'."
|
||||
" This violates the naming convention rules"
|
||||
" given in the Memory Management Guide for Cocoa";
|
||||
}
|
||||
|
||||
os << (isa<ObjCMethodDecl>(D) ? " is returned from a method "
|
||||
: " is returned from a function ");
|
||||
|
||||
if (D->getAttr<CFReturnsNotRetainedAttr>())
|
||||
os << "that is annotated as CF_RETURNS_NOT_RETAINED";
|
||||
else if (D->getAttr<NSReturnsNotRetainedAttr>())
|
||||
os << "that is annotated as NS_RETURNS_NOT_RETAINED";
|
||||
else {
|
||||
const FunctionDecl *FD = cast<FunctionDecl>(D);
|
||||
os << " is returned from a function whose name ('"
|
||||
<< *FD
|
||||
<< "') does not contain 'Copy' or 'Create'. This violates the naming"
|
||||
" convention rules given in the Memory Management Guide for Core"
|
||||
" Foundation";
|
||||
}
|
||||
if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) {
|
||||
os << "whose name ('" << MD->getSelector().getAsString()
|
||||
<< "') does not start with 'copy', 'mutableCopy', 'alloc' or 'new'."
|
||||
" This violates the naming convention rules"
|
||||
" given in the Memory Management Guide for Cocoa";
|
||||
}
|
||||
else {
|
||||
const FunctionDecl *FD = cast<FunctionDecl>(D);
|
||||
os << "whose name ('" << *FD
|
||||
<< "') does not contain 'Copy' or 'Create'. This violates the naming"
|
||||
" convention rules given in the Memory Management Guide for Core"
|
||||
" Foundation";
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (RV->getKind() == RefVal::ErrorGCLeakReturned) {
|
||||
ObjCMethodDecl &MD = cast<ObjCMethodDecl>(EndN->getCodeDecl());
|
||||
|
|
|
@ -1341,6 +1341,15 @@ void testattr4() {
|
|||
consume_cf(y);
|
||||
}
|
||||
|
||||
@interface TestOwnershipAttr2 : NSObject
|
||||
- (NSString*) newString NS_RETURNS_NOT_RETAINED; // no-warning
|
||||
@end
|
||||
|
||||
@implementation TestOwnershipAttr2
|
||||
- (NSString*) newString {
|
||||
return [NSString alloc]; // expected-warning {{Potential leak of an object}}
|
||||
}
|
||||
@end
|
||||
|
||||
@interface MyClassTestCFAttr : NSObject {}
|
||||
- (NSDate*) returnsCFRetained CF_RETURNS_RETAINED;
|
||||
|
|
Загрузка…
Ссылка в новой задаче