New message for cases when ownership is taken:
"+method_name: cannot take ownership of memory allocated by 'new'." instead of the old "Memory allocated by 'new' should be deallocated by 'delete', not +method_name" llvm-svn: 190800
This commit is contained in:
parent
e0e28d059b
commit
f5bcccee76
|
@ -313,7 +313,7 @@ private:
|
|||
const Expr *DeallocExpr) const;
|
||||
void ReportMismatchedDealloc(CheckerContext &C, SourceRange Range,
|
||||
const Expr *DeallocExpr, const RefState *RS,
|
||||
SymbolRef Sym) const;
|
||||
SymbolRef Sym, bool OwnershipTransferred) const;
|
||||
void ReportOffsetFree(CheckerContext &C, SVal ArgVal, SourceRange Range,
|
||||
const Expr *DeallocExpr,
|
||||
const Expr *AllocExpr = 0) const;
|
||||
|
@ -1042,7 +1042,7 @@ ProgramStateRef MallocChecker::FreeMemAux(CheckerContext &C,
|
|||
RsBase->getAllocationFamily() == getAllocationFamily(C, ParentExpr);
|
||||
if (!DeallocMatchesAlloc) {
|
||||
ReportMismatchedDealloc(C, ArgExpr->getSourceRange(),
|
||||
ParentExpr, RsBase, SymBase);
|
||||
ParentExpr, RsBase, SymBase, Hold);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1260,7 +1260,8 @@ void MallocChecker::ReportMismatchedDealloc(CheckerContext &C,
|
|||
SourceRange Range,
|
||||
const Expr *DeallocExpr,
|
||||
const RefState *RS,
|
||||
SymbolRef Sym) const {
|
||||
SymbolRef Sym,
|
||||
bool OwnershipTransferred) const {
|
||||
|
||||
if (!Filter.CMismatchedDeallocatorChecker)
|
||||
return;
|
||||
|
@ -1279,15 +1280,27 @@ void MallocChecker::ReportMismatchedDealloc(CheckerContext &C,
|
|||
SmallString<20> DeallocBuf;
|
||||
llvm::raw_svector_ostream DeallocOs(DeallocBuf);
|
||||
|
||||
os << "Memory";
|
||||
if (printAllocDeallocName(AllocOs, C, AllocExpr))
|
||||
os << " allocated by " << AllocOs.str();
|
||||
if (OwnershipTransferred) {
|
||||
if (printAllocDeallocName(DeallocOs, C, DeallocExpr))
|
||||
os << DeallocOs.str() << " cannot";
|
||||
else
|
||||
os << "Cannot";
|
||||
|
||||
os << " should be deallocated by ";
|
||||
printExpectedDeallocName(os, RS->getAllocationFamily());
|
||||
os << " take ownership of memory";
|
||||
|
||||
if (printAllocDeallocName(DeallocOs, C, DeallocExpr))
|
||||
os << ", not " << DeallocOs.str();
|
||||
if (printAllocDeallocName(AllocOs, C, AllocExpr))
|
||||
os << " allocated by " << AllocOs.str();
|
||||
} else {
|
||||
os << "Memory";
|
||||
if (printAllocDeallocName(AllocOs, C, AllocExpr))
|
||||
os << " allocated by " << AllocOs.str();
|
||||
|
||||
os << " should be deallocated by ";
|
||||
printExpectedDeallocName(os, RS->getAllocationFamily());
|
||||
|
||||
if (printAllocDeallocName(DeallocOs, C, DeallocExpr))
|
||||
os << ", not " << DeallocOs.str();
|
||||
}
|
||||
|
||||
BugReport *R = new BugReport(*BT_MismatchedDealloc, os.str(), N);
|
||||
R->markInteresting(Sym);
|
||||
|
|
|
@ -112,8 +112,7 @@ void testNew10() {
|
|||
|
||||
void testNew11(NSUInteger dataLength) {
|
||||
int *p = new int;
|
||||
NSData *d = [NSData dataWithBytesNoCopy:p length:sizeof(int) freeWhenDone:1]; // expected-warning{{Memory allocated by 'new' should be deallocated by 'delete', not +dataWithBytesNoCopy:length:freeWhenDone:}}
|
||||
// FIXME: should be "+dataWithBytesNoCopy:length:freeWhenDone: cannot take ownership of memory allocated by 'new'."
|
||||
NSData *d = [NSData dataWithBytesNoCopy:p length:sizeof(int) freeWhenDone:1]; // expected-warning{{+dataWithBytesNoCopy:length:freeWhenDone: cannot take ownership of memory allocated by 'new'}}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------
|
||||
|
|
Loading…
Reference in New Issue