зеркало из https://github.com/microsoft/clang.git
Tighen analyzer diagnostics w.r.t ObjC/CF leaks.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@132130 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
42ec65df77
Коммит
f13654600b
|
@ -2090,7 +2090,7 @@ PathDiagnosticPiece* CFRefReport::VisitNode(const ExplodedNode* N,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CurrV.isOwned()) {
|
if (CurrV.isOwned()) {
|
||||||
os << "+1 retain count (owning reference).";
|
os << "+1 retain count";
|
||||||
|
|
||||||
if (static_cast<CFRefBug&>(getBugType()).getTF().isGCEnabled()) {
|
if (static_cast<CFRefBug&>(getBugType()).getTF().isGCEnabled()) {
|
||||||
assert(CurrV.getObjKind() == RetEffect::CF);
|
assert(CurrV.getObjKind() == RetEffect::CF);
|
||||||
|
@ -2100,7 +2100,7 @@ PathDiagnosticPiece* CFRefReport::VisitNode(const ExplodedNode* N,
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
assert (CurrV.isNotOwned());
|
assert (CurrV.isNotOwned());
|
||||||
os << "+0 retain count (non-owning reference).";
|
os << "+0 retain count";
|
||||||
}
|
}
|
||||||
|
|
||||||
PathDiagnosticLocation Pos(S, BRC.getSourceManager());
|
PathDiagnosticLocation Pos(S, BRC.getSourceManager());
|
||||||
|
@ -2232,11 +2232,11 @@ PathDiagnosticPiece* CFRefReport::VisitNode(const ExplodedNode* N,
|
||||||
|
|
||||||
case RefVal::ReturnedOwned:
|
case RefVal::ReturnedOwned:
|
||||||
os << "Object returned to caller as an owning reference (single retain "
|
os << "Object returned to caller as an owning reference (single retain "
|
||||||
"count transferred to caller).";
|
"count transferred to caller)";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RefVal::ReturnedNotOwned:
|
case RefVal::ReturnedNotOwned:
|
||||||
os << "Object returned to caller with a +0 (non-owning) retain count.";
|
os << "Object returned to caller with a +0 retain count";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -2369,12 +2369,7 @@ CFRefLeakReport::getEndPath(BugReporterContext& BRC,
|
||||||
llvm::tie(AllocNode, FirstBinding) =
|
llvm::tie(AllocNode, FirstBinding) =
|
||||||
GetAllocationSite(BRC.getStateManager(), EndN, Sym);
|
GetAllocationSite(BRC.getStateManager(), EndN, Sym);
|
||||||
|
|
||||||
// Get the allocate site.
|
|
||||||
assert(AllocNode);
|
|
||||||
const Stmt* FirstStmt = cast<PostStmt>(AllocNode->getLocation()).getStmt();
|
|
||||||
|
|
||||||
SourceManager& SMgr = BRC.getSourceManager();
|
SourceManager& SMgr = BRC.getSourceManager();
|
||||||
unsigned AllocLine =SMgr.getInstantiationLineNumber(FirstStmt->getLocStart());
|
|
||||||
|
|
||||||
// Compute an actual location for the leak. Sometimes a leak doesn't
|
// Compute an actual location for the leak. Sometimes a leak doesn't
|
||||||
// occur at an actual statement (e.g., transition between blocks; end
|
// occur at an actual statement (e.g., transition between blocks; end
|
||||||
|
@ -2407,10 +2402,14 @@ CFRefLeakReport::getEndPath(BugReporterContext& BRC,
|
||||||
std::string sbuf;
|
std::string sbuf;
|
||||||
llvm::raw_string_ostream os(sbuf);
|
llvm::raw_string_ostream os(sbuf);
|
||||||
|
|
||||||
os << "Object allocated on line " << AllocLine;
|
os << "Object leaked: ";
|
||||||
|
|
||||||
if (FirstBinding)
|
if (FirstBinding) {
|
||||||
os << " and stored into '" << FirstBinding->getString() << '\'';
|
os << "object allocated and stored into '"
|
||||||
|
<< FirstBinding->getString() << '\'';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
os << "allocated object";
|
||||||
|
|
||||||
// Get the retain count.
|
// Get the retain count.
|
||||||
const RefVal* RV = EndN->getState()->get<RefBindings>(Sym);
|
const RefVal* RV = EndN->getState()->get<RefBindings>(Sym);
|
||||||
|
@ -2425,7 +2424,7 @@ CFRefLeakReport::getEndPath(BugReporterContext& BRC,
|
||||||
<< MD->getSelector().getAsString()
|
<< MD->getSelector().getAsString()
|
||||||
<< "') does not start with 'copy', 'mutableCopy', 'alloc' or 'new'."
|
<< "') does not start with 'copy', 'mutableCopy', 'alloc' or 'new'."
|
||||||
" This violates the naming convention rules "
|
" This violates the naming convention rules "
|
||||||
" given in the Memory Management Guide for Cocoa (object leaked)";
|
" given in the Memory Management Guide for Cocoa";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const FunctionDecl *FD = cast<FunctionDecl>(D);
|
const FunctionDecl *FD = cast<FunctionDecl>(D);
|
||||||
|
@ -2433,7 +2432,7 @@ CFRefLeakReport::getEndPath(BugReporterContext& BRC,
|
||||||
<< FD->getNameAsString()
|
<< FD->getNameAsString()
|
||||||
<< "') does not contain 'Copy' or 'Create'. This violates the naming"
|
<< "') does not contain 'Copy' or 'Create'. This violates the naming"
|
||||||
" convention rules given the Memory Management Guide for Core "
|
" convention rules given the Memory Management Guide for Core "
|
||||||
" Foundation (object leaked)";
|
" Foundation";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (RV->getKind() == RefVal::ErrorGCLeakReturned) {
|
else if (RV->getKind() == RefVal::ErrorGCLeakReturned) {
|
||||||
|
@ -2446,7 +2445,7 @@ CFRefLeakReport::getEndPath(BugReporterContext& BRC,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
os << " is not referenced later in this execution path and has a retain "
|
os << " is not referenced later in this execution path and has a retain "
|
||||||
"count of +" << RV->getCount() << " (object leaked)";
|
"count of +" << RV->getCount();
|
||||||
|
|
||||||
return new PathDiagnosticEventPiece(L, os.str());
|
return new PathDiagnosticEventPiece(L, os.str());
|
||||||
}
|
}
|
||||||
|
|
|
@ -864,9 +864,9 @@ void rdar8331641(int x) {
|
||||||
// CHECK: </array>
|
// CHECK: </array>
|
||||||
// CHECK: </array>
|
// CHECK: </array>
|
||||||
// CHECK: <key>extended_message</key>
|
// CHECK: <key>extended_message</key>
|
||||||
// CHECK: <string>Call to function 'CFNumberCreate' returns a Core Foundation object with a +1 retain count (owning reference)</string>
|
// CHECK: <string>Call to function 'CFNumberCreate' returns a Core Foundation object with a +1 retain count</string>
|
||||||
// CHECK: <key>message</key>
|
// CHECK: <key>message</key>
|
||||||
// CHECK: <string>Call to function 'CFNumberCreate' returns a Core Foundation object with a +1 retain count (owning reference)</string>
|
// CHECK: <string>Call to function 'CFNumberCreate' returns a Core Foundation object with a +1 retain count</string>
|
||||||
// CHECK: </dict>
|
// CHECK: </dict>
|
||||||
// CHECK: <dict>
|
// CHECK: <dict>
|
||||||
// CHECK: <key>kind</key><string>control</string>
|
// CHECK: <key>kind</key><string>control</string>
|
||||||
|
@ -994,9 +994,9 @@ void rdar8331641(int x) {
|
||||||
// CHECK: </array>
|
// CHECK: </array>
|
||||||
// CHECK: </array>
|
// CHECK: </array>
|
||||||
// CHECK: <key>extended_message</key>
|
// CHECK: <key>extended_message</key>
|
||||||
// CHECK: <string>Object allocated on line 53 and stored into 'value' is not referenced later in this execution path and has a retain count of +1 (object leaked)</string>
|
// CHECK: <string>Object leaked: object allocated and stored into 'value' is not referenced later in this execution path and has a retain count of +1</string>
|
||||||
// CHECK: <key>message</key>
|
// CHECK: <key>message</key>
|
||||||
// CHECK: <string>Object allocated on line 53 and stored into 'value' is not referenced later in this execution path and has a retain count of +1 (object leaked)</string>
|
// CHECK: <string>Object leaked: object allocated and stored into 'value' is not referenced later in this execution path and has a retain count of +1</string>
|
||||||
// CHECK: </dict>
|
// CHECK: </dict>
|
||||||
// CHECK: </array>
|
// CHECK: </array>
|
||||||
// CHECK: <key>description</key><string>Potential leak of an object allocated on line 53 and stored into 'value'</string>
|
// CHECK: <key>description</key><string>Potential leak of an object allocated on line 53 and stored into 'value'</string>
|
||||||
|
@ -1012,3 +1012,4 @@ void rdar8331641(int x) {
|
||||||
// CHECK: </array>
|
// CHECK: </array>
|
||||||
// CHECK: </dict>
|
// CHECK: </dict>
|
||||||
// CHECK: </plist>
|
// CHECK: </plist>
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче