MallocChecker.cpp revision 849c7bf718ed3c08bd66b93f0bd508a44bb2f669
1//=== MallocChecker.cpp - A malloc/free checker -------------------*- C++ -*--// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines malloc/free checker, which checks for potential memory 11// leaks, double free, and use-after-free problems. 12// 13//===----------------------------------------------------------------------===// 14 15#include "ClangSACheckers.h" 16#include "InterCheckerAPI.h" 17#include "clang/AST/Attr.h" 18#include "clang/Basic/SourceManager.h" 19#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h" 20#include "clang/StaticAnalyzer/Core/Checker.h" 21#include "clang/StaticAnalyzer/Core/CheckerManager.h" 22#include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h" 23#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h" 24#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h" 25#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h" 26#include "clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h" 27#include "llvm/ADT/ImmutableMap.h" 28#include "llvm/ADT/STLExtras.h" 29#include "llvm/ADT/SmallString.h" 30#include "llvm/ADT/StringExtras.h" 31#include <climits> 32 33using namespace clang; 34using namespace ento; 35 36namespace { 37 38// Used to check correspondence between allocators and deallocators. 39enum AllocationFamily { 40 AF_None, 41 AF_Malloc, 42 AF_CXXNew, 43 AF_CXXNewArray 44}; 45 46class RefState { 47 enum Kind { // Reference to allocated memory. 48 Allocated, 49 // Reference to released/freed memory. 50 Released, 51 // The responsibility for freeing resources has transfered from 52 // this reference. A relinquished symbol should not be freed. 53 Relinquished }; 54 55 const Stmt *S; 56 unsigned K : 2; // Kind enum, but stored as a bitfield. 57 unsigned Family : 30; // Rest of 32-bit word, currently just an allocation 58 // family. 59 60 RefState(Kind k, const Stmt *s, unsigned family) 61 : K(k), S(s), Family(family) {} 62public: 63 bool isAllocated() const { return K == Allocated; } 64 bool isReleased() const { return K == Released; } 65 bool isRelinquished() const { return K == Relinquished; } 66 AllocationFamily getAllocationFamily() const { 67 return (AllocationFamily)Family; 68 } 69 const Stmt *getStmt() const { return S; } 70 71 bool operator==(const RefState &X) const { 72 return K == X.K && S == X.S && Family == X.Family; 73 } 74 75 static RefState getAllocated(unsigned family, const Stmt *s) { 76 return RefState(Allocated, s, family); 77 } 78 static RefState getReleased(unsigned family, const Stmt *s) { 79 return RefState(Released, s, family); 80 } 81 static RefState getRelinquished(unsigned family, const Stmt *s) { 82 return RefState(Relinquished, s, family); 83 } 84 85 void Profile(llvm::FoldingSetNodeID &ID) const { 86 ID.AddInteger(K); 87 ID.AddPointer(S); 88 ID.AddInteger(Family); 89 } 90 91 void dump(raw_ostream &OS) const { 92 static const char *Table[] = { 93 "Allocated", 94 "Released", 95 "Relinquished" 96 }; 97 OS << Table[(unsigned) K]; 98 } 99 100 LLVM_ATTRIBUTE_USED void dump() const { 101 dump(llvm::errs()); 102 } 103}; 104 105enum ReallocPairKind { 106 RPToBeFreedAfterFailure, 107 // The symbol has been freed when reallocation failed. 108 RPIsFreeOnFailure, 109 // The symbol does not need to be freed after reallocation fails. 110 RPDoNotTrackAfterFailure 111}; 112 113/// \class ReallocPair 114/// \brief Stores information about the symbol being reallocated by a call to 115/// 'realloc' to allow modeling failed reallocation later in the path. 116struct ReallocPair { 117 // \brief The symbol which realloc reallocated. 118 SymbolRef ReallocatedSym; 119 ReallocPairKind Kind; 120 121 ReallocPair(SymbolRef S, ReallocPairKind K) : 122 ReallocatedSym(S), Kind(K) {} 123 void Profile(llvm::FoldingSetNodeID &ID) const { 124 ID.AddInteger(Kind); 125 ID.AddPointer(ReallocatedSym); 126 } 127 bool operator==(const ReallocPair &X) const { 128 return ReallocatedSym == X.ReallocatedSym && 129 Kind == X.Kind; 130 } 131}; 132 133typedef std::pair<const ExplodedNode*, const MemRegion*> LeakInfo; 134 135class MallocChecker : public Checker<check::DeadSymbols, 136 check::PointerEscape, 137 check::PreStmt<ReturnStmt>, 138 check::PreStmt<CallExpr>, 139 check::PostStmt<CallExpr>, 140 check::PostStmt<CXXNewExpr>, 141 check::PreStmt<CXXDeleteExpr>, 142 check::PostStmt<BlockExpr>, 143 check::PostObjCMessage, 144 check::Location, 145 eval::Assume> 146{ 147 mutable OwningPtr<BugType> BT_DoubleFree; 148 mutable OwningPtr<BugType> BT_Leak; 149 mutable OwningPtr<BugType> BT_UseFree; 150 mutable OwningPtr<BugType> BT_BadFree; 151 mutable OwningPtr<BugType> BT_BadDealloc; 152 mutable OwningPtr<BugType> BT_OffsetFree; 153 mutable IdentifierInfo *II_malloc, *II_free, *II_realloc, *II_calloc, 154 *II_valloc, *II_reallocf, *II_strndup, *II_strdup; 155 156public: 157 MallocChecker() : II_malloc(0), II_free(0), II_realloc(0), II_calloc(0), 158 II_valloc(0), II_reallocf(0), II_strndup(0), II_strdup(0) {} 159 160 /// In pessimistic mode, the checker assumes that it does not know which 161 /// functions might free the memory. 162 struct ChecksFilter { 163 DefaultBool CMallocPessimistic; 164 DefaultBool CMallocOptimistic; 165 DefaultBool CNewDeleteChecker; 166 DefaultBool CMismatchedDeallocatorChecker; 167 }; 168 169 ChecksFilter Filter; 170 171 void checkPreStmt(const CallExpr *S, CheckerContext &C) const; 172 void checkPostStmt(const CallExpr *CE, CheckerContext &C) const; 173 void checkPostStmt(const CXXNewExpr *NE, CheckerContext &C) const; 174 void checkPreStmt(const CXXDeleteExpr *DE, CheckerContext &C) const; 175 void checkPostObjCMessage(const ObjCMethodCall &Call, CheckerContext &C) const; 176 void checkPostStmt(const BlockExpr *BE, CheckerContext &C) const; 177 void checkDeadSymbols(SymbolReaper &SymReaper, CheckerContext &C) const; 178 void checkPreStmt(const ReturnStmt *S, CheckerContext &C) const; 179 ProgramStateRef evalAssume(ProgramStateRef state, SVal Cond, 180 bool Assumption) const; 181 void checkLocation(SVal l, bool isLoad, const Stmt *S, 182 CheckerContext &C) const; 183 184 ProgramStateRef checkPointerEscape(ProgramStateRef State, 185 const InvalidatedSymbols &Escaped, 186 const CallEvent *Call, 187 PointerEscapeKind Kind) const; 188 189 void printState(raw_ostream &Out, ProgramStateRef State, 190 const char *NL, const char *Sep) const; 191 192private: 193 void initIdentifierInfo(ASTContext &C) const; 194 195 /// \brief Determine family of a deallocation expression. 196 AllocationFamily getAllocationFamily(CheckerContext &C, const Expr *E) const; 197 198 /// \brief Print names of allocators and deallocators. 199 /// 200 /// \returns true on success. 201 bool printAllocDeallocName(raw_ostream &os, CheckerContext &C, 202 const Expr *E) const; 203 204 /// \brief Print expected name of an allocator based on the deallocator's 205 /// family derived from the DeallocExpr. 206 void printExpectedAllocName(raw_ostream &os, CheckerContext &C, 207 const Expr *DeallocExpr) const; 208 /// \brief Print expected name of a deallocator based on the allocator's 209 /// family. 210 void printExpectedDeallocName(raw_ostream &os, AllocationFamily Family) const; 211 212 ///@{ 213 /// Check if this is one of the functions which can allocate/reallocate memory 214 /// pointed to by one of its arguments. 215 bool isMemFunction(const FunctionDecl *FD, ASTContext &C) const; 216 bool isFreeFunction(const FunctionDecl *FD, ASTContext &C) const; 217 bool isAllocationFunction(const FunctionDecl *FD, ASTContext &C) const; 218 bool isStandardNewDelete(const FunctionDecl *FD, ASTContext &C) const; 219 ///@} 220 static ProgramStateRef MallocMemReturnsAttr(CheckerContext &C, 221 const CallExpr *CE, 222 const OwnershipAttr* Att); 223 static ProgramStateRef MallocMemAux(CheckerContext &C, const CallExpr *CE, 224 const Expr *SizeEx, SVal Init, 225 ProgramStateRef State, 226 AllocationFamily Family = AF_Malloc) { 227 return MallocMemAux(C, CE, 228 State->getSVal(SizeEx, C.getLocationContext()), 229 Init, State, Family); 230 } 231 232 static ProgramStateRef MallocMemAux(CheckerContext &C, const CallExpr *CE, 233 SVal SizeEx, SVal Init, 234 ProgramStateRef State, 235 AllocationFamily Family = AF_Malloc); 236 237 /// Update the RefState to reflect the new memory allocation. 238 static ProgramStateRef 239 MallocUpdateRefState(CheckerContext &C, const Expr *E, ProgramStateRef State, 240 AllocationFamily Family = AF_Malloc); 241 242 ProgramStateRef FreeMemAttr(CheckerContext &C, const CallExpr *CE, 243 const OwnershipAttr* Att) const; 244 ProgramStateRef FreeMemAux(CheckerContext &C, const CallExpr *CE, 245 ProgramStateRef state, unsigned Num, 246 bool Hold, 247 bool &ReleasedAllocated, 248 bool ReturnsNullOnFailure = false) const; 249 ProgramStateRef FreeMemAux(CheckerContext &C, const Expr *Arg, 250 const Expr *ParentExpr, 251 ProgramStateRef State, 252 bool Hold, 253 bool &ReleasedAllocated, 254 bool ReturnsNullOnFailure = false) const; 255 256 ProgramStateRef ReallocMem(CheckerContext &C, const CallExpr *CE, 257 bool FreesMemOnFailure) const; 258 static ProgramStateRef CallocMem(CheckerContext &C, const CallExpr *CE); 259 260 ///\brief Check if the memory associated with this symbol was released. 261 bool isReleased(SymbolRef Sym, CheckerContext &C) const; 262 263 bool checkUseAfterFree(SymbolRef Sym, CheckerContext &C, const Stmt *S) const; 264 265 /// Check if the function is known not to free memory, or if it is 266 /// "interesting" and should be modeled explicitly. 267 /// 268 /// We assume that pointers do not escape through calls to system functions 269 /// not handled by this checker. 270 bool doesNotFreeMemOrInteresting(const CallEvent *Call, 271 ProgramStateRef State) const; 272 273 static bool SummarizeValue(raw_ostream &os, SVal V); 274 static bool SummarizeRegion(raw_ostream &os, const MemRegion *MR); 275 void ReportBadFree(CheckerContext &C, SVal ArgVal, SourceRange Range, 276 const Expr *DeallocExpr) const; 277 void ReportBadDealloc(CheckerContext &C, SourceRange Range, 278 const Expr *DeallocExpr, const RefState *RS) const; 279 void ReportOffsetFree(CheckerContext &C, SVal ArgVal, SourceRange Range, 280 const Expr *DeallocExpr, 281 const Expr *AllocExpr = 0) const; 282 void ReportUseAfterFree(CheckerContext &C, SourceRange Range, 283 SymbolRef Sym) const; 284 void ReportDoubleFree(CheckerContext &C, SourceRange Range, bool Released, 285 SymbolRef Sym, SymbolRef PrevSym) const; 286 287 /// Find the location of the allocation for Sym on the path leading to the 288 /// exploded node N. 289 LeakInfo getAllocationSite(const ExplodedNode *N, SymbolRef Sym, 290 CheckerContext &C) const; 291 292 void reportLeak(SymbolRef Sym, ExplodedNode *N, CheckerContext &C) const; 293 294 /// The bug visitor which allows us to print extra diagnostics along the 295 /// BugReport path. For example, showing the allocation site of the leaked 296 /// region. 297 class MallocBugVisitor : public BugReporterVisitorImpl<MallocBugVisitor> { 298 protected: 299 enum NotificationMode { 300 Normal, 301 ReallocationFailed 302 }; 303 304 // The allocated region symbol tracked by the main analysis. 305 SymbolRef Sym; 306 307 // The mode we are in, i.e. what kind of diagnostics will be emitted. 308 NotificationMode Mode; 309 310 // A symbol from when the primary region should have been reallocated. 311 SymbolRef FailedReallocSymbol; 312 313 bool IsLeak; 314 315 public: 316 MallocBugVisitor(SymbolRef S, bool isLeak = false) 317 : Sym(S), Mode(Normal), FailedReallocSymbol(0), IsLeak(isLeak) {} 318 319 virtual ~MallocBugVisitor() {} 320 321 void Profile(llvm::FoldingSetNodeID &ID) const { 322 static int X = 0; 323 ID.AddPointer(&X); 324 ID.AddPointer(Sym); 325 } 326 327 inline bool isAllocated(const RefState *S, const RefState *SPrev, 328 const Stmt *Stmt) { 329 // Did not track -> allocated. Other state (released) -> allocated. 330 return (Stmt && (isa<CallExpr>(Stmt) || isa<CXXNewExpr>(Stmt)) && 331 (S && S->isAllocated()) && (!SPrev || !SPrev->isAllocated())); 332 } 333 334 inline bool isReleased(const RefState *S, const RefState *SPrev, 335 const Stmt *Stmt) { 336 // Did not track -> released. Other state (allocated) -> released. 337 return (Stmt && (isa<CallExpr>(Stmt) || isa<CXXDeleteExpr>(Stmt)) && 338 (S && S->isReleased()) && (!SPrev || !SPrev->isReleased())); 339 } 340 341 inline bool isRelinquished(const RefState *S, const RefState *SPrev, 342 const Stmt *Stmt) { 343 // Did not track -> relinquished. Other state (allocated) -> relinquished. 344 return (Stmt && (isa<CallExpr>(Stmt) || isa<ObjCMessageExpr>(Stmt) || 345 isa<ObjCPropertyRefExpr>(Stmt)) && 346 (S && S->isRelinquished()) && 347 (!SPrev || !SPrev->isRelinquished())); 348 } 349 350 inline bool isReallocFailedCheck(const RefState *S, const RefState *SPrev, 351 const Stmt *Stmt) { 352 // If the expression is not a call, and the state change is 353 // released -> allocated, it must be the realloc return value 354 // check. If we have to handle more cases here, it might be cleaner just 355 // to track this extra bit in the state itself. 356 return ((!Stmt || !isa<CallExpr>(Stmt)) && 357 (S && S->isAllocated()) && (SPrev && !SPrev->isAllocated())); 358 } 359 360 PathDiagnosticPiece *VisitNode(const ExplodedNode *N, 361 const ExplodedNode *PrevN, 362 BugReporterContext &BRC, 363 BugReport &BR); 364 365 PathDiagnosticPiece* getEndPath(BugReporterContext &BRC, 366 const ExplodedNode *EndPathNode, 367 BugReport &BR) { 368 if (!IsLeak) 369 return 0; 370 371 PathDiagnosticLocation L = 372 PathDiagnosticLocation::createEndOfPath(EndPathNode, 373 BRC.getSourceManager()); 374 // Do not add the statement itself as a range in case of leak. 375 return new PathDiagnosticEventPiece(L, BR.getDescription(), false); 376 } 377 378 private: 379 class StackHintGeneratorForReallocationFailed 380 : public StackHintGeneratorForSymbol { 381 public: 382 StackHintGeneratorForReallocationFailed(SymbolRef S, StringRef M) 383 : StackHintGeneratorForSymbol(S, M) {} 384 385 virtual std::string getMessageForArg(const Expr *ArgE, unsigned ArgIndex) { 386 // Printed parameters start at 1, not 0. 387 ++ArgIndex; 388 389 SmallString<200> buf; 390 llvm::raw_svector_ostream os(buf); 391 392 os << "Reallocation of " << ArgIndex << llvm::getOrdinalSuffix(ArgIndex) 393 << " parameter failed"; 394 395 return os.str(); 396 } 397 398 virtual std::string getMessageForReturn(const CallExpr *CallExpr) { 399 return "Reallocation of returned value failed"; 400 } 401 }; 402 }; 403}; 404} // end anonymous namespace 405 406REGISTER_MAP_WITH_PROGRAMSTATE(RegionState, SymbolRef, RefState) 407REGISTER_MAP_WITH_PROGRAMSTATE(ReallocPairs, SymbolRef, ReallocPair) 408 409// A map from the freed symbol to the symbol representing the return value of 410// the free function. 411REGISTER_MAP_WITH_PROGRAMSTATE(FreeReturnValue, SymbolRef, SymbolRef) 412 413namespace { 414class StopTrackingCallback : public SymbolVisitor { 415 ProgramStateRef state; 416public: 417 StopTrackingCallback(ProgramStateRef st) : state(st) {} 418 ProgramStateRef getState() const { return state; } 419 420 bool VisitSymbol(SymbolRef sym) { 421 state = state->remove<RegionState>(sym); 422 return true; 423 } 424}; 425} // end anonymous namespace 426 427void MallocChecker::initIdentifierInfo(ASTContext &Ctx) const { 428 if (II_malloc) 429 return; 430 II_malloc = &Ctx.Idents.get("malloc"); 431 II_free = &Ctx.Idents.get("free"); 432 II_realloc = &Ctx.Idents.get("realloc"); 433 II_reallocf = &Ctx.Idents.get("reallocf"); 434 II_calloc = &Ctx.Idents.get("calloc"); 435 II_valloc = &Ctx.Idents.get("valloc"); 436 II_strdup = &Ctx.Idents.get("strdup"); 437 II_strndup = &Ctx.Idents.get("strndup"); 438} 439 440bool MallocChecker::isMemFunction(const FunctionDecl *FD, ASTContext &C) const { 441 if (isFreeFunction(FD, C)) 442 return true; 443 444 if (isAllocationFunction(FD, C)) 445 return true; 446 447 if (isStandardNewDelete(FD, C)) 448 return true; 449 450 return false; 451} 452 453bool MallocChecker::isAllocationFunction(const FunctionDecl *FD, 454 ASTContext &C) const { 455 if (!FD) 456 return false; 457 458 if (FD->getKind() == Decl::Function) { 459 IdentifierInfo *FunI = FD->getIdentifier(); 460 initIdentifierInfo(C); 461 462 if (FunI == II_malloc || FunI == II_realloc || 463 FunI == II_reallocf || FunI == II_calloc || FunI == II_valloc || 464 FunI == II_strdup || FunI == II_strndup) 465 return true; 466 } 467 468 if (Filter.CMallocOptimistic && FD->hasAttrs()) 469 for (specific_attr_iterator<OwnershipAttr> 470 i = FD->specific_attr_begin<OwnershipAttr>(), 471 e = FD->specific_attr_end<OwnershipAttr>(); 472 i != e; ++i) 473 if ((*i)->getOwnKind() == OwnershipAttr::Returns) 474 return true; 475 return false; 476} 477 478bool MallocChecker::isFreeFunction(const FunctionDecl *FD, ASTContext &C) const { 479 if (!FD) 480 return false; 481 482 if (FD->getKind() == Decl::Function) { 483 IdentifierInfo *FunI = FD->getIdentifier(); 484 initIdentifierInfo(C); 485 486 if (FunI == II_free || FunI == II_realloc || FunI == II_reallocf) 487 return true; 488 } 489 490 if (Filter.CMallocOptimistic && FD->hasAttrs()) 491 for (specific_attr_iterator<OwnershipAttr> 492 i = FD->specific_attr_begin<OwnershipAttr>(), 493 e = FD->specific_attr_end<OwnershipAttr>(); 494 i != e; ++i) 495 if ((*i)->getOwnKind() == OwnershipAttr::Takes || 496 (*i)->getOwnKind() == OwnershipAttr::Holds) 497 return true; 498 return false; 499} 500 501// Tells if the callee is one of the following: 502// 1) A global non-placement new/delete operator function. 503// 2) A global placement operator function with the single placement argument 504// of type std::nothrow_t. 505bool MallocChecker::isStandardNewDelete(const FunctionDecl *FD, 506 ASTContext &C) const { 507 if (!FD) 508 return false; 509 510 OverloadedOperatorKind Kind = FD->getOverloadedOperator(); 511 if (Kind != OO_New && Kind != OO_Array_New && 512 Kind != OO_Delete && Kind != OO_Array_Delete) 513 return false; 514 515 // Skip all operator new/delete methods. 516 if (isa<CXXMethodDecl>(FD)) 517 return false; 518 519 // Return true if tested operator is a standard placement nothrow operator. 520 if (FD->getNumParams() == 2) { 521 QualType T = FD->getParamDecl(1)->getType(); 522 if (const IdentifierInfo *II = T.getBaseTypeIdentifier()) 523 return II->getName().equals("nothrow_t"); 524 } 525 526 // Skip placement operators. 527 if (FD->getNumParams() != 1 || FD->isVariadic()) 528 return false; 529 530 // One of the standard new/new[]/delete/delete[] non-placement operators. 531 return true; 532} 533 534void MallocChecker::checkPostStmt(const CallExpr *CE, CheckerContext &C) const { 535 if (C.wasInlined) 536 return; 537 538 const FunctionDecl *FD = C.getCalleeDecl(CE); 539 if (!FD) 540 return; 541 542 ProgramStateRef State = C.getState(); 543 bool ReleasedAllocatedMemory = false; 544 545 if (FD->getKind() == Decl::Function) { 546 initIdentifierInfo(C.getASTContext()); 547 IdentifierInfo *FunI = FD->getIdentifier(); 548 549 if (Filter.CMallocOptimistic || Filter.CMallocPessimistic || 550 Filter.CMismatchedDeallocatorChecker) { 551 if (FunI == II_malloc || FunI == II_valloc) { 552 if (CE->getNumArgs() < 1) 553 return; 554 State = MallocMemAux(C, CE, CE->getArg(0), UndefinedVal(), State); 555 } else if (FunI == II_realloc) { 556 State = ReallocMem(C, CE, false); 557 } else if (FunI == II_reallocf) { 558 State = ReallocMem(C, CE, true); 559 } else if (FunI == II_calloc) { 560 State = CallocMem(C, CE); 561 } else if (FunI == II_free) { 562 State = FreeMemAux(C, CE, State, 0, false, ReleasedAllocatedMemory); 563 } else if (FunI == II_strdup) { 564 State = MallocUpdateRefState(C, CE, State); 565 } else if (FunI == II_strndup) { 566 State = MallocUpdateRefState(C, CE, State); 567 } 568 } 569 570 if (Filter.CNewDeleteChecker || Filter.CMismatchedDeallocatorChecker) { 571 if (isStandardNewDelete(FD, C.getASTContext())) { 572 // Process direct calls to operator new/new[]/delete/delete[] functions 573 // as distinct from new/new[]/delete/delete[] expressions that are 574 // processed by the checkPostStmt callbacks for CXXNewExpr and 575 // CXXDeleteExpr. 576 OverloadedOperatorKind K = FD->getOverloadedOperator(); 577 if (K == OO_New) 578 State = MallocMemAux(C, CE, CE->getArg(0), UndefinedVal(), State, 579 AF_CXXNew); 580 else if (K == OO_Array_New) 581 State = MallocMemAux(C, CE, CE->getArg(0), UndefinedVal(), State, 582 AF_CXXNewArray); 583 else if (K == OO_Delete || K == OO_Array_Delete) 584 State = FreeMemAux(C, CE, State, 0, false, ReleasedAllocatedMemory); 585 else 586 llvm_unreachable("not a new/delete operator"); 587 } 588 } 589 } 590 591 if (Filter.CMallocOptimistic || Filter.CMismatchedDeallocatorChecker) { 592 // Check all the attributes, if there are any. 593 // There can be multiple of these attributes. 594 if (FD->hasAttrs()) 595 for (specific_attr_iterator<OwnershipAttr> 596 i = FD->specific_attr_begin<OwnershipAttr>(), 597 e = FD->specific_attr_end<OwnershipAttr>(); 598 i != e; ++i) { 599 switch ((*i)->getOwnKind()) { 600 case OwnershipAttr::Returns: 601 State = MallocMemReturnsAttr(C, CE, *i); 602 break; 603 case OwnershipAttr::Takes: 604 case OwnershipAttr::Holds: 605 State = FreeMemAttr(C, CE, *i); 606 break; 607 } 608 } 609 } 610 C.addTransition(State); 611} 612 613void MallocChecker::checkPostStmt(const CXXNewExpr *NE, 614 CheckerContext &C) const { 615 616 if (NE->getNumPlacementArgs()) 617 for (CXXNewExpr::const_arg_iterator I = NE->placement_arg_begin(), 618 E = NE->placement_arg_end(); I != E; ++I) 619 if (SymbolRef Sym = C.getSVal(*I).getAsSymbol()) 620 checkUseAfterFree(Sym, C, *I); 621 622 if (!Filter.CNewDeleteChecker && !Filter.CMismatchedDeallocatorChecker) 623 return; 624 625 if (!isStandardNewDelete(NE->getOperatorNew(), C.getASTContext())) 626 return; 627 628 ProgramStateRef State = C.getState(); 629 // The return value from operator new is bound to a specified initialization 630 // value (if any) and we don't want to loose this value. So we call 631 // MallocUpdateRefState() instead of MallocMemAux() which breakes the 632 // existing binding. 633 State = MallocUpdateRefState(C, NE, State, NE->isArray() ? AF_CXXNewArray 634 : AF_CXXNew); 635 C.addTransition(State); 636} 637 638void MallocChecker::checkPreStmt(const CXXDeleteExpr *DE, 639 CheckerContext &C) const { 640 641 if (!Filter.CNewDeleteChecker) 642 if (SymbolRef Sym = C.getSVal(DE->getArgument()).getAsSymbol()) 643 checkUseAfterFree(Sym, C, DE->getArgument()); 644 645 if (!Filter.CNewDeleteChecker && !Filter.CMismatchedDeallocatorChecker) 646 return; 647 648 if (!isStandardNewDelete(DE->getOperatorDelete(), C.getASTContext())) 649 return; 650 651 ProgramStateRef State = C.getState(); 652 bool ReleasedAllocated; 653 State = FreeMemAux(C, DE->getArgument(), DE, State, 654 /*Hold*/false, ReleasedAllocated); 655 656 C.addTransition(State); 657} 658 659static bool isKnownDeallocObjCMethodName(const ObjCMethodCall &Call) { 660 // If the first selector piece is one of the names below, assume that the 661 // object takes ownership of the memory, promising to eventually deallocate it 662 // with free(). 663 // Ex: [NSData dataWithBytesNoCopy:bytes length:10]; 664 // (...unless a 'freeWhenDone' parameter is false, but that's checked later.) 665 StringRef FirstSlot = Call.getSelector().getNameForSlot(0); 666 if (FirstSlot == "dataWithBytesNoCopy" || 667 FirstSlot == "initWithBytesNoCopy" || 668 FirstSlot == "initWithCharactersNoCopy") 669 return true; 670 671 return false; 672} 673 674static Optional<bool> getFreeWhenDoneArg(const ObjCMethodCall &Call) { 675 Selector S = Call.getSelector(); 676 677 // FIXME: We should not rely on fully-constrained symbols being folded. 678 for (unsigned i = 1; i < S.getNumArgs(); ++i) 679 if (S.getNameForSlot(i).equals("freeWhenDone")) 680 return !Call.getArgSVal(i).isZeroConstant(); 681 682 return None; 683} 684 685void MallocChecker::checkPostObjCMessage(const ObjCMethodCall &Call, 686 CheckerContext &C) const { 687 if (C.wasInlined) 688 return; 689 690 if (!isKnownDeallocObjCMethodName(Call)) 691 return; 692 693 if (Optional<bool> FreeWhenDone = getFreeWhenDoneArg(Call)) 694 if (!*FreeWhenDone) 695 return; 696 697 bool ReleasedAllocatedMemory; 698 ProgramStateRef State = FreeMemAux(C, Call.getArgExpr(0), 699 Call.getOriginExpr(), C.getState(), 700 /*Hold=*/true, ReleasedAllocatedMemory, 701 /*RetNullOnFailure=*/true); 702 703 C.addTransition(State); 704} 705 706ProgramStateRef MallocChecker::MallocMemReturnsAttr(CheckerContext &C, 707 const CallExpr *CE, 708 const OwnershipAttr* Att) { 709 if (Att->getModule() != "malloc") 710 return 0; 711 712 OwnershipAttr::args_iterator I = Att->args_begin(), E = Att->args_end(); 713 if (I != E) { 714 return MallocMemAux(C, CE, CE->getArg(*I), UndefinedVal(), C.getState()); 715 } 716 return MallocMemAux(C, CE, UnknownVal(), UndefinedVal(), C.getState()); 717} 718 719ProgramStateRef MallocChecker::MallocMemAux(CheckerContext &C, 720 const CallExpr *CE, 721 SVal Size, SVal Init, 722 ProgramStateRef State, 723 AllocationFamily Family) { 724 725 // Bind the return value to the symbolic value from the heap region. 726 // TODO: We could rewrite post visit to eval call; 'malloc' does not have 727 // side effects other than what we model here. 728 unsigned Count = C.blockCount(); 729 SValBuilder &svalBuilder = C.getSValBuilder(); 730 const LocationContext *LCtx = C.getPredecessor()->getLocationContext(); 731 DefinedSVal RetVal = svalBuilder.getConjuredHeapSymbolVal(CE, LCtx, Count) 732 .castAs<DefinedSVal>(); 733 State = State->BindExpr(CE, C.getLocationContext(), RetVal); 734 735 // We expect the malloc functions to return a pointer. 736 if (!RetVal.getAs<Loc>()) 737 return 0; 738 739 // Fill the region with the initialization value. 740 State = State->bindDefault(RetVal, Init); 741 742 // Set the region's extent equal to the Size parameter. 743 const SymbolicRegion *R = 744 dyn_cast_or_null<SymbolicRegion>(RetVal.getAsRegion()); 745 if (!R) 746 return 0; 747 if (Optional<DefinedOrUnknownSVal> DefinedSize = 748 Size.getAs<DefinedOrUnknownSVal>()) { 749 SValBuilder &svalBuilder = C.getSValBuilder(); 750 DefinedOrUnknownSVal Extent = R->getExtent(svalBuilder); 751 DefinedOrUnknownSVal extentMatchesSize = 752 svalBuilder.evalEQ(State, Extent, *DefinedSize); 753 754 State = State->assume(extentMatchesSize, true); 755 assert(State); 756 } 757 758 return MallocUpdateRefState(C, CE, State, Family); 759} 760 761ProgramStateRef MallocChecker::MallocUpdateRefState(CheckerContext &C, 762 const Expr *E, 763 ProgramStateRef State, 764 AllocationFamily Family) { 765 // Get the return value. 766 SVal retVal = State->getSVal(E, C.getLocationContext()); 767 768 // We expect the malloc functions to return a pointer. 769 if (!retVal.getAs<Loc>()) 770 return 0; 771 772 SymbolRef Sym = retVal.getAsLocSymbol(); 773 assert(Sym); 774 775 // Set the symbol's state to Allocated. 776 return State->set<RegionState>(Sym, RefState::getAllocated(Family, E)); 777} 778 779ProgramStateRef MallocChecker::FreeMemAttr(CheckerContext &C, 780 const CallExpr *CE, 781 const OwnershipAttr* Att) const { 782 if (Att->getModule() != "malloc") 783 return 0; 784 785 ProgramStateRef State = C.getState(); 786 bool ReleasedAllocated = false; 787 788 for (OwnershipAttr::args_iterator I = Att->args_begin(), E = Att->args_end(); 789 I != E; ++I) { 790 ProgramStateRef StateI = FreeMemAux(C, CE, State, *I, 791 Att->getOwnKind() == OwnershipAttr::Holds, 792 ReleasedAllocated); 793 if (StateI) 794 State = StateI; 795 } 796 return State; 797} 798 799ProgramStateRef MallocChecker::FreeMemAux(CheckerContext &C, 800 const CallExpr *CE, 801 ProgramStateRef state, 802 unsigned Num, 803 bool Hold, 804 bool &ReleasedAllocated, 805 bool ReturnsNullOnFailure) const { 806 if (CE->getNumArgs() < (Num + 1)) 807 return 0; 808 809 return FreeMemAux(C, CE->getArg(Num), CE, state, Hold, 810 ReleasedAllocated, ReturnsNullOnFailure); 811} 812 813/// Checks if the previous call to free on the given symbol failed - if free 814/// failed, returns true. Also, returns the corresponding return value symbol. 815static bool didPreviousFreeFail(ProgramStateRef State, 816 SymbolRef Sym, SymbolRef &RetStatusSymbol) { 817 const SymbolRef *Ret = State->get<FreeReturnValue>(Sym); 818 if (Ret) { 819 assert(*Ret && "We should not store the null return symbol"); 820 ConstraintManager &CMgr = State->getConstraintManager(); 821 ConditionTruthVal FreeFailed = CMgr.isNull(State, *Ret); 822 RetStatusSymbol = *Ret; 823 return FreeFailed.isConstrainedTrue(); 824 } 825 return false; 826} 827 828AllocationFamily MallocChecker::getAllocationFamily(CheckerContext &C, 829 const Expr *E) const { 830 if (!E) 831 return AF_None; 832 833 if (const CallExpr *CE = dyn_cast<CallExpr>(E)) { 834 const FunctionDecl *FD = C.getCalleeDecl(CE); 835 ASTContext &Ctx = C.getASTContext(); 836 837 if (isFreeFunction(FD, Ctx)) 838 return AF_Malloc; 839 840 if (isStandardNewDelete(FD, Ctx)) { 841 OverloadedOperatorKind Kind = FD->getOverloadedOperator(); 842 if (Kind == OO_Delete) 843 return AF_CXXNew; 844 else if (Kind == OO_Array_Delete) 845 return AF_CXXNewArray; 846 } 847 848 return AF_None; 849 } 850 851 if (const CXXDeleteExpr *DE = dyn_cast<CXXDeleteExpr>(E)) 852 return DE->isArrayForm() ? AF_CXXNewArray : AF_CXXNew; 853 854 if (isa<ObjCMessageExpr>(E)) 855 return AF_Malloc; 856 857 return AF_None; 858} 859 860bool MallocChecker::printAllocDeallocName(raw_ostream &os, CheckerContext &C, 861 const Expr *E) const { 862 if (const CallExpr *CE = dyn_cast<CallExpr>(E)) { 863 // FIXME: This doesn't handle indirect calls. 864 const FunctionDecl *FD = CE->getDirectCallee(); 865 if (!FD) 866 return false; 867 868 os << *FD; 869 if (!FD->isOverloadedOperator()) 870 os << "()"; 871 return true; 872 } 873 874 if (const ObjCMessageExpr *Msg = dyn_cast<ObjCMessageExpr>(E)) { 875 if (Msg->isInstanceMessage()) 876 os << "-"; 877 else 878 os << "+"; 879 os << Msg->getSelector().getAsString(); 880 return true; 881 } 882 883 if (const CXXNewExpr *NE = dyn_cast<CXXNewExpr>(E)) { 884 os << "'" 885 << getOperatorSpelling(NE->getOperatorNew()->getOverloadedOperator()) 886 << "'"; 887 return true; 888 } 889 890 if (const CXXDeleteExpr *DE = dyn_cast<CXXDeleteExpr>(E)) { 891 os << "'" 892 << getOperatorSpelling(DE->getOperatorDelete()->getOverloadedOperator()) 893 << "'"; 894 return true; 895 } 896 897 return false; 898} 899 900void MallocChecker::printExpectedAllocName(raw_ostream &os, CheckerContext &C, 901 const Expr *E) const { 902 AllocationFamily Family = getAllocationFamily(C, E); 903 904 switch(Family) { 905 case AF_Malloc: os << "malloc()"; return; 906 case AF_CXXNew: os << "'new'"; return; 907 case AF_CXXNewArray: os << "'new[]'"; return; 908 case AF_None: llvm_unreachable("not a deallocation expression"); 909 } 910} 911 912void MallocChecker::printExpectedDeallocName(raw_ostream &os, 913 AllocationFamily Family) const { 914 switch(Family) { 915 case AF_Malloc: os << "free()"; return; 916 case AF_CXXNew: os << "'delete'"; return; 917 case AF_CXXNewArray: os << "'delete[]'"; return; 918 case AF_None: llvm_unreachable("suspicious AF_None argument"); 919 } 920} 921 922ProgramStateRef MallocChecker::FreeMemAux(CheckerContext &C, 923 const Expr *ArgExpr, 924 const Expr *ParentExpr, 925 ProgramStateRef State, 926 bool Hold, 927 bool &ReleasedAllocated, 928 bool ReturnsNullOnFailure) const { 929 930 SVal ArgVal = State->getSVal(ArgExpr, C.getLocationContext()); 931 if (!ArgVal.getAs<DefinedOrUnknownSVal>()) 932 return 0; 933 DefinedOrUnknownSVal location = ArgVal.castAs<DefinedOrUnknownSVal>(); 934 935 // Check for null dereferences. 936 if (!location.getAs<Loc>()) 937 return 0; 938 939 // The explicit NULL case, no operation is performed. 940 ProgramStateRef notNullState, nullState; 941 llvm::tie(notNullState, nullState) = State->assume(location); 942 if (nullState && !notNullState) 943 return 0; 944 945 // Unknown values could easily be okay 946 // Undefined values are handled elsewhere 947 if (ArgVal.isUnknownOrUndef()) 948 return 0; 949 950 const MemRegion *R = ArgVal.getAsRegion(); 951 952 // Nonlocs can't be freed, of course. 953 // Non-region locations (labels and fixed addresses) also shouldn't be freed. 954 if (!R) { 955 ReportBadFree(C, ArgVal, ArgExpr->getSourceRange(), ParentExpr); 956 return 0; 957 } 958 959 R = R->StripCasts(); 960 961 // Blocks might show up as heap data, but should not be free()d 962 if (isa<BlockDataRegion>(R)) { 963 ReportBadFree(C, ArgVal, ArgExpr->getSourceRange(), ParentExpr); 964 return 0; 965 } 966 967 const MemSpaceRegion *MS = R->getMemorySpace(); 968 969 // Parameters, locals, statics, globals, and memory returned by alloca() 970 // shouldn't be freed. 971 if (!(isa<UnknownSpaceRegion>(MS) || isa<HeapSpaceRegion>(MS))) { 972 // FIXME: at the time this code was written, malloc() regions were 973 // represented by conjured symbols, which are all in UnknownSpaceRegion. 974 // This means that there isn't actually anything from HeapSpaceRegion 975 // that should be freed, even though we allow it here. 976 // Of course, free() can work on memory allocated outside the current 977 // function, so UnknownSpaceRegion is always a possibility. 978 // False negatives are better than false positives. 979 980 ReportBadFree(C, ArgVal, ArgExpr->getSourceRange(), ParentExpr); 981 return 0; 982 } 983 984 const SymbolicRegion *SrBase = dyn_cast<SymbolicRegion>(R->getBaseRegion()); 985 // Various cases could lead to non-symbol values here. 986 // For now, ignore them. 987 if (!SrBase) 988 return 0; 989 990 SymbolRef SymBase = SrBase->getSymbol(); 991 const RefState *RsBase = State->get<RegionState>(SymBase); 992 SymbolRef PreviousRetStatusSymbol = 0; 993 994 // Check double free. 995 if (RsBase && 996 (RsBase->isReleased() || RsBase->isRelinquished()) && 997 !didPreviousFreeFail(State, SymBase, PreviousRetStatusSymbol)) { 998 ReportDoubleFree(C, ParentExpr->getSourceRange(), RsBase->isReleased(), 999 SymBase, PreviousRetStatusSymbol); 1000 return 0; 1001 } 1002 1003 // Check if an expected deallocation function matches the real one. 1004 if (RsBase && 1005 RsBase->getAllocationFamily() != AF_None && 1006 RsBase->getAllocationFamily() != getAllocationFamily(C, ParentExpr) ) { 1007 ReportBadDealloc(C, ArgExpr->getSourceRange(), ParentExpr, RsBase); 1008 return 0; 1009 } 1010 1011 // Check if the memory location being freed is the actual location 1012 // allocated, or an offset. 1013 RegionOffset Offset = R->getAsOffset(); 1014 if (RsBase && RsBase->isAllocated() && 1015 Offset.isValid() && 1016 !Offset.hasSymbolicOffset() && 1017 Offset.getOffset() != 0) { 1018 const Expr *AllocExpr = cast<Expr>(RsBase->getStmt()); 1019 ReportOffsetFree(C, ArgVal, ArgExpr->getSourceRange(), ParentExpr, 1020 AllocExpr); 1021 return 0; 1022 } 1023 1024 ReleasedAllocated = (RsBase != 0); 1025 1026 // Clean out the info on previous call to free return info. 1027 State = State->remove<FreeReturnValue>(SymBase); 1028 1029 // Keep track of the return value. If it is NULL, we will know that free 1030 // failed. 1031 if (ReturnsNullOnFailure) { 1032 SVal RetVal = C.getSVal(ParentExpr); 1033 SymbolRef RetStatusSymbol = RetVal.getAsSymbol(); 1034 if (RetStatusSymbol) { 1035 C.getSymbolManager().addSymbolDependency(SymBase, RetStatusSymbol); 1036 State = State->set<FreeReturnValue>(SymBase, RetStatusSymbol); 1037 } 1038 } 1039 1040 AllocationFamily Family = RsBase ? RsBase->getAllocationFamily() : AF_None; 1041 // Normal free. 1042 if (Hold) 1043 return State->set<RegionState>(SymBase, 1044 RefState::getRelinquished(Family, 1045 ParentExpr)); 1046 1047 return State->set<RegionState>(SymBase, 1048 RefState::getReleased(Family, ParentExpr)); 1049} 1050 1051bool MallocChecker::SummarizeValue(raw_ostream &os, SVal V) { 1052 if (Optional<nonloc::ConcreteInt> IntVal = V.getAs<nonloc::ConcreteInt>()) 1053 os << "an integer (" << IntVal->getValue() << ")"; 1054 else if (Optional<loc::ConcreteInt> ConstAddr = V.getAs<loc::ConcreteInt>()) 1055 os << "a constant address (" << ConstAddr->getValue() << ")"; 1056 else if (Optional<loc::GotoLabel> Label = V.getAs<loc::GotoLabel>()) 1057 os << "the address of the label '" << Label->getLabel()->getName() << "'"; 1058 else 1059 return false; 1060 1061 return true; 1062} 1063 1064bool MallocChecker::SummarizeRegion(raw_ostream &os, 1065 const MemRegion *MR) { 1066 switch (MR->getKind()) { 1067 case MemRegion::FunctionTextRegionKind: { 1068 const NamedDecl *FD = cast<FunctionTextRegion>(MR)->getDecl(); 1069 if (FD) 1070 os << "the address of the function '" << *FD << '\''; 1071 else 1072 os << "the address of a function"; 1073 return true; 1074 } 1075 case MemRegion::BlockTextRegionKind: 1076 os << "block text"; 1077 return true; 1078 case MemRegion::BlockDataRegionKind: 1079 // FIXME: where the block came from? 1080 os << "a block"; 1081 return true; 1082 default: { 1083 const MemSpaceRegion *MS = MR->getMemorySpace(); 1084 1085 if (isa<StackLocalsSpaceRegion>(MS)) { 1086 const VarRegion *VR = dyn_cast<VarRegion>(MR); 1087 const VarDecl *VD; 1088 if (VR) 1089 VD = VR->getDecl(); 1090 else 1091 VD = NULL; 1092 1093 if (VD) 1094 os << "the address of the local variable '" << VD->getName() << "'"; 1095 else 1096 os << "the address of a local stack variable"; 1097 return true; 1098 } 1099 1100 if (isa<StackArgumentsSpaceRegion>(MS)) { 1101 const VarRegion *VR = dyn_cast<VarRegion>(MR); 1102 const VarDecl *VD; 1103 if (VR) 1104 VD = VR->getDecl(); 1105 else 1106 VD = NULL; 1107 1108 if (VD) 1109 os << "the address of the parameter '" << VD->getName() << "'"; 1110 else 1111 os << "the address of a parameter"; 1112 return true; 1113 } 1114 1115 if (isa<GlobalsSpaceRegion>(MS)) { 1116 const VarRegion *VR = dyn_cast<VarRegion>(MR); 1117 const VarDecl *VD; 1118 if (VR) 1119 VD = VR->getDecl(); 1120 else 1121 VD = NULL; 1122 1123 if (VD) { 1124 if (VD->isStaticLocal()) 1125 os << "the address of the static variable '" << VD->getName() << "'"; 1126 else 1127 os << "the address of the global variable '" << VD->getName() << "'"; 1128 } else 1129 os << "the address of a global variable"; 1130 return true; 1131 } 1132 1133 return false; 1134 } 1135 } 1136} 1137 1138void MallocChecker::ReportBadFree(CheckerContext &C, SVal ArgVal, 1139 SourceRange Range, 1140 const Expr *DeallocExpr) const { 1141 1142 if (!Filter.CMallocOptimistic && !Filter.CMallocPessimistic && 1143 !Filter.CNewDeleteChecker) 1144 return; 1145 1146 if (ExplodedNode *N = C.generateSink()) { 1147 if (!BT_BadFree) 1148 BT_BadFree.reset(new BugType("Bad free", "Memory Error")); 1149 1150 SmallString<100> buf; 1151 llvm::raw_svector_ostream os(buf); 1152 1153 const MemRegion *MR = ArgVal.getAsRegion(); 1154 while (const ElementRegion *ER = dyn_cast_or_null<ElementRegion>(MR)) 1155 MR = ER->getSuperRegion(); 1156 1157 if (MR && isa<AllocaRegion>(MR)) 1158 os << "Memory allocated by alloca() should not be deallocated"; 1159 else { 1160 os << "Argument to "; 1161 if (!printAllocDeallocName(os, C, DeallocExpr)) 1162 os << "deallocator"; 1163 1164 os << " is "; 1165 bool Summarized = MR ? SummarizeRegion(os, MR) 1166 : SummarizeValue(os, ArgVal); 1167 if (Summarized) 1168 os << ", which is not memory allocated by "; 1169 else 1170 os << "not memory allocated by "; 1171 1172 printExpectedAllocName(os, C, DeallocExpr); 1173 } 1174 1175 BugReport *R = new BugReport(*BT_BadFree, os.str(), N); 1176 R->markInteresting(MR); 1177 R->addRange(Range); 1178 C.emitReport(R); 1179 } 1180} 1181 1182void MallocChecker::ReportBadDealloc(CheckerContext &C, SourceRange Range, 1183 const Expr *DeallocExpr, 1184 const RefState *RS) const { 1185 1186 if (!Filter.CMismatchedDeallocatorChecker) 1187 return; 1188 1189 if (ExplodedNode *N = C.generateSink()) { 1190 if (!BT_BadDealloc) 1191 BT_BadDealloc.reset(new BugType("Bad deallocator", "Memory Error")); 1192 1193 SmallString<100> buf; 1194 llvm::raw_svector_ostream os(buf); 1195 1196 const Expr *AllocExpr = cast<Expr>(RS->getStmt()); 1197 SmallString<20> AllocBuf; 1198 llvm::raw_svector_ostream AllocOs(AllocBuf); 1199 SmallString<20> DeallocBuf; 1200 llvm::raw_svector_ostream DeallocOs(DeallocBuf); 1201 1202 os << "Memory"; 1203 if (printAllocDeallocName(AllocOs, C, AllocExpr)) 1204 os << " allocated by " << AllocOs.str(); 1205 1206 os << " should be deallocated by "; 1207 printExpectedDeallocName(os, RS->getAllocationFamily()); 1208 1209 if (printAllocDeallocName(DeallocOs, C, DeallocExpr)) 1210 os << ", not " << DeallocOs.str(); 1211 1212 BugReport *R = new BugReport(*BT_BadDealloc, os.str(), N); 1213 R->addRange(Range); 1214 C.emitReport(R); 1215 } 1216} 1217 1218void MallocChecker::ReportOffsetFree(CheckerContext &C, SVal ArgVal, 1219 SourceRange Range, const Expr *DeallocExpr, 1220 const Expr *AllocExpr) const { 1221 1222 if (!Filter.CMallocOptimistic && !Filter.CMallocPessimistic && 1223 !Filter.CNewDeleteChecker) 1224 return; 1225 1226 ExplodedNode *N = C.generateSink(); 1227 if (N == NULL) 1228 return; 1229 1230 if (!BT_OffsetFree) 1231 BT_OffsetFree.reset(new BugType("Offset free", "Memory Error")); 1232 1233 SmallString<100> buf; 1234 llvm::raw_svector_ostream os(buf); 1235 SmallString<20> AllocNameBuf; 1236 llvm::raw_svector_ostream AllocNameOs(AllocNameBuf); 1237 1238 const MemRegion *MR = ArgVal.getAsRegion(); 1239 assert(MR && "Only MemRegion based symbols can have offset free errors"); 1240 1241 RegionOffset Offset = MR->getAsOffset(); 1242 assert((Offset.isValid() && 1243 !Offset.hasSymbolicOffset() && 1244 Offset.getOffset() != 0) && 1245 "Only symbols with a valid offset can have offset free errors"); 1246 1247 int offsetBytes = Offset.getOffset() / C.getASTContext().getCharWidth(); 1248 1249 os << "Argument to "; 1250 if (!printAllocDeallocName(os, C, DeallocExpr)) 1251 os << "deallocator"; 1252 os << " is offset by " 1253 << offsetBytes 1254 << " " 1255 << ((abs(offsetBytes) > 1) ? "bytes" : "byte") 1256 << " from the start of "; 1257 if (AllocExpr && printAllocDeallocName(AllocNameOs, C, AllocExpr)) 1258 os << "memory allocated by " << AllocNameOs.str(); 1259 else 1260 os << "allocated memory"; 1261 1262 BugReport *R = new BugReport(*BT_OffsetFree, os.str(), N); 1263 R->markInteresting(MR->getBaseRegion()); 1264 R->addRange(Range); 1265 C.emitReport(R); 1266} 1267 1268void MallocChecker::ReportUseAfterFree(CheckerContext &C, SourceRange Range, 1269 SymbolRef Sym) const { 1270 1271 if (!Filter.CMallocOptimistic && !Filter.CMallocPessimistic && 1272 !Filter.CNewDeleteChecker) 1273 return; 1274 1275 if (ExplodedNode *N = C.generateSink()) { 1276 if (!BT_UseFree) 1277 BT_UseFree.reset(new BugType("Use-after-free", "Memory Error")); 1278 1279 BugReport *R = new BugReport(*BT_UseFree, 1280 "Use of memory after it is freed", N); 1281 1282 R->markInteresting(Sym); 1283 R->addRange(Range); 1284 R->addVisitor(new MallocBugVisitor(Sym)); 1285 C.emitReport(R); 1286 } 1287} 1288 1289void MallocChecker::ReportDoubleFree(CheckerContext &C, SourceRange Range, 1290 bool Released, SymbolRef Sym, 1291 SymbolRef PrevSym) const { 1292 1293 if (!Filter.CMallocOptimistic && !Filter.CMallocPessimistic && 1294 !Filter.CNewDeleteChecker) 1295 return; 1296 1297 if (ExplodedNode *N = C.generateSink()) { 1298 if (!BT_DoubleFree) 1299 BT_DoubleFree.reset(new BugType("Double free", "Memory Error")); 1300 1301 BugReport *R = new BugReport(*BT_DoubleFree, 1302 (Released ? "Attempt to free released memory" 1303 : "Attempt to free non-owned memory"), 1304 N); 1305 R->addRange(Range); 1306 R->markInteresting(Sym); 1307 if (PrevSym) 1308 R->markInteresting(PrevSym); 1309 R->addVisitor(new MallocBugVisitor(Sym)); 1310 C.emitReport(R); 1311 } 1312} 1313 1314ProgramStateRef MallocChecker::ReallocMem(CheckerContext &C, 1315 const CallExpr *CE, 1316 bool FreesOnFail) const { 1317 if (CE->getNumArgs() < 2) 1318 return 0; 1319 1320 ProgramStateRef state = C.getState(); 1321 const Expr *arg0Expr = CE->getArg(0); 1322 const LocationContext *LCtx = C.getLocationContext(); 1323 SVal Arg0Val = state->getSVal(arg0Expr, LCtx); 1324 if (!Arg0Val.getAs<DefinedOrUnknownSVal>()) 1325 return 0; 1326 DefinedOrUnknownSVal arg0Val = Arg0Val.castAs<DefinedOrUnknownSVal>(); 1327 1328 SValBuilder &svalBuilder = C.getSValBuilder(); 1329 1330 DefinedOrUnknownSVal PtrEQ = 1331 svalBuilder.evalEQ(state, arg0Val, svalBuilder.makeNull()); 1332 1333 // Get the size argument. If there is no size arg then give up. 1334 const Expr *Arg1 = CE->getArg(1); 1335 if (!Arg1) 1336 return 0; 1337 1338 // Get the value of the size argument. 1339 SVal Arg1ValG = state->getSVal(Arg1, LCtx); 1340 if (!Arg1ValG.getAs<DefinedOrUnknownSVal>()) 1341 return 0; 1342 DefinedOrUnknownSVal Arg1Val = Arg1ValG.castAs<DefinedOrUnknownSVal>(); 1343 1344 // Compare the size argument to 0. 1345 DefinedOrUnknownSVal SizeZero = 1346 svalBuilder.evalEQ(state, Arg1Val, 1347 svalBuilder.makeIntValWithPtrWidth(0, false)); 1348 1349 ProgramStateRef StatePtrIsNull, StatePtrNotNull; 1350 llvm::tie(StatePtrIsNull, StatePtrNotNull) = state->assume(PtrEQ); 1351 ProgramStateRef StateSizeIsZero, StateSizeNotZero; 1352 llvm::tie(StateSizeIsZero, StateSizeNotZero) = state->assume(SizeZero); 1353 // We only assume exceptional states if they are definitely true; if the 1354 // state is under-constrained, assume regular realloc behavior. 1355 bool PrtIsNull = StatePtrIsNull && !StatePtrNotNull; 1356 bool SizeIsZero = StateSizeIsZero && !StateSizeNotZero; 1357 1358 // If the ptr is NULL and the size is not 0, the call is equivalent to 1359 // malloc(size). 1360 if ( PrtIsNull && !SizeIsZero) { 1361 ProgramStateRef stateMalloc = MallocMemAux(C, CE, CE->getArg(1), 1362 UndefinedVal(), StatePtrIsNull); 1363 return stateMalloc; 1364 } 1365 1366 if (PrtIsNull && SizeIsZero) 1367 return 0; 1368 1369 // Get the from and to pointer symbols as in toPtr = realloc(fromPtr, size). 1370 assert(!PrtIsNull); 1371 SymbolRef FromPtr = arg0Val.getAsSymbol(); 1372 SVal RetVal = state->getSVal(CE, LCtx); 1373 SymbolRef ToPtr = RetVal.getAsSymbol(); 1374 if (!FromPtr || !ToPtr) 1375 return 0; 1376 1377 bool ReleasedAllocated = false; 1378 1379 // If the size is 0, free the memory. 1380 if (SizeIsZero) 1381 if (ProgramStateRef stateFree = FreeMemAux(C, CE, StateSizeIsZero, 0, 1382 false, ReleasedAllocated)){ 1383 // The semantics of the return value are: 1384 // If size was equal to 0, either NULL or a pointer suitable to be passed 1385 // to free() is returned. We just free the input pointer and do not add 1386 // any constrains on the output pointer. 1387 return stateFree; 1388 } 1389 1390 // Default behavior. 1391 if (ProgramStateRef stateFree = 1392 FreeMemAux(C, CE, state, 0, false, ReleasedAllocated)) { 1393 1394 ProgramStateRef stateRealloc = MallocMemAux(C, CE, CE->getArg(1), 1395 UnknownVal(), stateFree); 1396 if (!stateRealloc) 1397 return 0; 1398 1399 ReallocPairKind Kind = RPToBeFreedAfterFailure; 1400 if (FreesOnFail) 1401 Kind = RPIsFreeOnFailure; 1402 else if (!ReleasedAllocated) 1403 Kind = RPDoNotTrackAfterFailure; 1404 1405 // Record the info about the reallocated symbol so that we could properly 1406 // process failed reallocation. 1407 stateRealloc = stateRealloc->set<ReallocPairs>(ToPtr, 1408 ReallocPair(FromPtr, Kind)); 1409 // The reallocated symbol should stay alive for as long as the new symbol. 1410 C.getSymbolManager().addSymbolDependency(ToPtr, FromPtr); 1411 return stateRealloc; 1412 } 1413 return 0; 1414} 1415 1416ProgramStateRef MallocChecker::CallocMem(CheckerContext &C, const CallExpr *CE){ 1417 if (CE->getNumArgs() < 2) 1418 return 0; 1419 1420 ProgramStateRef state = C.getState(); 1421 SValBuilder &svalBuilder = C.getSValBuilder(); 1422 const LocationContext *LCtx = C.getLocationContext(); 1423 SVal count = state->getSVal(CE->getArg(0), LCtx); 1424 SVal elementSize = state->getSVal(CE->getArg(1), LCtx); 1425 SVal TotalSize = svalBuilder.evalBinOp(state, BO_Mul, count, elementSize, 1426 svalBuilder.getContext().getSizeType()); 1427 SVal zeroVal = svalBuilder.makeZeroVal(svalBuilder.getContext().CharTy); 1428 1429 return MallocMemAux(C, CE, TotalSize, zeroVal, state); 1430} 1431 1432LeakInfo 1433MallocChecker::getAllocationSite(const ExplodedNode *N, SymbolRef Sym, 1434 CheckerContext &C) const { 1435 const LocationContext *LeakContext = N->getLocationContext(); 1436 // Walk the ExplodedGraph backwards and find the first node that referred to 1437 // the tracked symbol. 1438 const ExplodedNode *AllocNode = N; 1439 const MemRegion *ReferenceRegion = 0; 1440 1441 while (N) { 1442 ProgramStateRef State = N->getState(); 1443 if (!State->get<RegionState>(Sym)) 1444 break; 1445 1446 // Find the most recent expression bound to the symbol in the current 1447 // context. 1448 if (!ReferenceRegion) { 1449 if (const MemRegion *MR = C.getLocationRegionIfPostStore(N)) { 1450 SVal Val = State->getSVal(MR); 1451 if (Val.getAsLocSymbol() == Sym) 1452 ReferenceRegion = MR; 1453 } 1454 } 1455 1456 // Allocation node, is the last node in the current context in which the 1457 // symbol was tracked. 1458 if (N->getLocationContext() == LeakContext) 1459 AllocNode = N; 1460 N = N->pred_empty() ? NULL : *(N->pred_begin()); 1461 } 1462 1463 return LeakInfo(AllocNode, ReferenceRegion); 1464} 1465 1466void MallocChecker::reportLeak(SymbolRef Sym, ExplodedNode *N, 1467 CheckerContext &C) const { 1468 1469 if (!Filter.CMallocOptimistic && !Filter.CMallocPessimistic && 1470 !Filter.CNewDeleteChecker) 1471 return; 1472 1473 assert(N); 1474 if (!BT_Leak) { 1475 BT_Leak.reset(new BugType("Memory leak", "Memory Error")); 1476 // Leaks should not be reported if they are post-dominated by a sink: 1477 // (1) Sinks are higher importance bugs. 1478 // (2) NoReturnFunctionChecker uses sink nodes to represent paths ending 1479 // with __noreturn functions such as assert() or exit(). We choose not 1480 // to report leaks on such paths. 1481 BT_Leak->setSuppressOnSink(true); 1482 } 1483 1484 // Most bug reports are cached at the location where they occurred. 1485 // With leaks, we want to unique them by the location where they were 1486 // allocated, and only report a single path. 1487 PathDiagnosticLocation LocUsedForUniqueing; 1488 const ExplodedNode *AllocNode = 0; 1489 const MemRegion *Region = 0; 1490 llvm::tie(AllocNode, Region) = getAllocationSite(N, Sym, C); 1491 1492 ProgramPoint P = AllocNode->getLocation(); 1493 const Stmt *AllocationStmt = 0; 1494 if (Optional<CallExitEnd> Exit = P.getAs<CallExitEnd>()) 1495 AllocationStmt = Exit->getCalleeContext()->getCallSite(); 1496 else if (Optional<StmtPoint> SP = P.getAs<StmtPoint>()) 1497 AllocationStmt = SP->getStmt(); 1498 if (AllocationStmt) 1499 LocUsedForUniqueing = PathDiagnosticLocation::createBegin(AllocationStmt, 1500 C.getSourceManager(), 1501 AllocNode->getLocationContext()); 1502 1503 SmallString<200> buf; 1504 llvm::raw_svector_ostream os(buf); 1505 os << "Memory is never released; potential leak"; 1506 if (Region && Region->canPrintPretty()) { 1507 os << " of memory pointed to by '"; 1508 Region->printPretty(os); 1509 os << '\''; 1510 } 1511 1512 BugReport *R = new BugReport(*BT_Leak, os.str(), N, 1513 LocUsedForUniqueing, 1514 AllocNode->getLocationContext()->getDecl()); 1515 R->markInteresting(Sym); 1516 R->addVisitor(new MallocBugVisitor(Sym, true)); 1517 C.emitReport(R); 1518} 1519 1520void MallocChecker::checkDeadSymbols(SymbolReaper &SymReaper, 1521 CheckerContext &C) const 1522{ 1523 if (!SymReaper.hasDeadSymbols()) 1524 return; 1525 1526 ProgramStateRef state = C.getState(); 1527 RegionStateTy RS = state->get<RegionState>(); 1528 RegionStateTy::Factory &F = state->get_context<RegionState>(); 1529 1530 SmallVector<SymbolRef, 2> Errors; 1531 for (RegionStateTy::iterator I = RS.begin(), E = RS.end(); I != E; ++I) { 1532 if (SymReaper.isDead(I->first)) { 1533 if (I->second.isAllocated()) 1534 Errors.push_back(I->first); 1535 // Remove the dead symbol from the map. 1536 RS = F.remove(RS, I->first); 1537 1538 } 1539 } 1540 1541 // Cleanup the Realloc Pairs Map. 1542 ReallocPairsTy RP = state->get<ReallocPairs>(); 1543 for (ReallocPairsTy::iterator I = RP.begin(), E = RP.end(); I != E; ++I) { 1544 if (SymReaper.isDead(I->first) || 1545 SymReaper.isDead(I->second.ReallocatedSym)) { 1546 state = state->remove<ReallocPairs>(I->first); 1547 } 1548 } 1549 1550 // Cleanup the FreeReturnValue Map. 1551 FreeReturnValueTy FR = state->get<FreeReturnValue>(); 1552 for (FreeReturnValueTy::iterator I = FR.begin(), E = FR.end(); I != E; ++I) { 1553 if (SymReaper.isDead(I->first) || 1554 SymReaper.isDead(I->second)) { 1555 state = state->remove<FreeReturnValue>(I->first); 1556 } 1557 } 1558 1559 // Generate leak node. 1560 ExplodedNode *N = C.getPredecessor(); 1561 if (!Errors.empty()) { 1562 static SimpleProgramPointTag Tag("MallocChecker : DeadSymbolsLeak"); 1563 N = C.addTransition(C.getState(), C.getPredecessor(), &Tag); 1564 for (SmallVector<SymbolRef, 2>::iterator 1565 I = Errors.begin(), E = Errors.end(); I != E; ++I) { 1566 reportLeak(*I, N, C); 1567 } 1568 } 1569 1570 C.addTransition(state->set<RegionState>(RS), N); 1571} 1572 1573void MallocChecker::checkPreStmt(const CallExpr *CE, CheckerContext &C) const { 1574 // We will check for double free in the post visit. 1575 if ((Filter.CMallocOptimistic || Filter.CMallocPessimistic) && 1576 isFreeFunction(C.getCalleeDecl(CE), C.getASTContext())) 1577 return; 1578 1579 if (Filter.CNewDeleteChecker && 1580 isStandardNewDelete(C.getCalleeDecl(CE), C.getASTContext())) 1581 return; 1582 1583 // Check use after free, when a freed pointer is passed to a call. 1584 ProgramStateRef State = C.getState(); 1585 for (CallExpr::const_arg_iterator I = CE->arg_begin(), 1586 E = CE->arg_end(); I != E; ++I) { 1587 const Expr *A = *I; 1588 if (A->getType().getTypePtr()->isAnyPointerType()) { 1589 SymbolRef Sym = C.getSVal(A).getAsSymbol(); 1590 if (!Sym) 1591 continue; 1592 if (checkUseAfterFree(Sym, C, A)) 1593 return; 1594 } 1595 } 1596} 1597 1598void MallocChecker::checkPreStmt(const ReturnStmt *S, CheckerContext &C) const { 1599 const Expr *E = S->getRetValue(); 1600 if (!E) 1601 return; 1602 1603 // Check if we are returning a symbol. 1604 ProgramStateRef State = C.getState(); 1605 SVal RetVal = State->getSVal(E, C.getLocationContext()); 1606 SymbolRef Sym = RetVal.getAsSymbol(); 1607 if (!Sym) 1608 // If we are returning a field of the allocated struct or an array element, 1609 // the callee could still free the memory. 1610 // TODO: This logic should be a part of generic symbol escape callback. 1611 if (const MemRegion *MR = RetVal.getAsRegion()) 1612 if (isa<FieldRegion>(MR) || isa<ElementRegion>(MR)) 1613 if (const SymbolicRegion *BMR = 1614 dyn_cast<SymbolicRegion>(MR->getBaseRegion())) 1615 Sym = BMR->getSymbol(); 1616 1617 // Check if we are returning freed memory. 1618 if (Sym) 1619 checkUseAfterFree(Sym, C, E); 1620} 1621 1622// TODO: Blocks should be either inlined or should call invalidate regions 1623// upon invocation. After that's in place, special casing here will not be 1624// needed. 1625void MallocChecker::checkPostStmt(const BlockExpr *BE, 1626 CheckerContext &C) const { 1627 1628 // Scan the BlockDecRefExprs for any object the retain count checker 1629 // may be tracking. 1630 if (!BE->getBlockDecl()->hasCaptures()) 1631 return; 1632 1633 ProgramStateRef state = C.getState(); 1634 const BlockDataRegion *R = 1635 cast<BlockDataRegion>(state->getSVal(BE, 1636 C.getLocationContext()).getAsRegion()); 1637 1638 BlockDataRegion::referenced_vars_iterator I = R->referenced_vars_begin(), 1639 E = R->referenced_vars_end(); 1640 1641 if (I == E) 1642 return; 1643 1644 SmallVector<const MemRegion*, 10> Regions; 1645 const LocationContext *LC = C.getLocationContext(); 1646 MemRegionManager &MemMgr = C.getSValBuilder().getRegionManager(); 1647 1648 for ( ; I != E; ++I) { 1649 const VarRegion *VR = I.getCapturedRegion(); 1650 if (VR->getSuperRegion() == R) { 1651 VR = MemMgr.getVarRegion(VR->getDecl(), LC); 1652 } 1653 Regions.push_back(VR); 1654 } 1655 1656 state = 1657 state->scanReachableSymbols<StopTrackingCallback>(Regions.data(), 1658 Regions.data() + Regions.size()).getState(); 1659 C.addTransition(state); 1660} 1661 1662bool MallocChecker::isReleased(SymbolRef Sym, CheckerContext &C) const { 1663 assert(Sym); 1664 const RefState *RS = C.getState()->get<RegionState>(Sym); 1665 return (RS && RS->isReleased()); 1666} 1667 1668bool MallocChecker::checkUseAfterFree(SymbolRef Sym, CheckerContext &C, 1669 const Stmt *S) const { 1670 1671 if (isReleased(Sym, C)) { 1672 ReportUseAfterFree(C, S->getSourceRange(), Sym); 1673 return true; 1674 } 1675 1676 return false; 1677} 1678 1679// Check if the location is a freed symbolic region. 1680void MallocChecker::checkLocation(SVal l, bool isLoad, const Stmt *S, 1681 CheckerContext &C) const { 1682 SymbolRef Sym = l.getLocSymbolInBase(); 1683 if (Sym) 1684 checkUseAfterFree(Sym, C, S); 1685} 1686 1687// If a symbolic region is assumed to NULL (or another constant), stop tracking 1688// it - assuming that allocation failed on this path. 1689ProgramStateRef MallocChecker::evalAssume(ProgramStateRef state, 1690 SVal Cond, 1691 bool Assumption) const { 1692 RegionStateTy RS = state->get<RegionState>(); 1693 for (RegionStateTy::iterator I = RS.begin(), E = RS.end(); I != E; ++I) { 1694 // If the symbol is assumed to be NULL, remove it from consideration. 1695 ConstraintManager &CMgr = state->getConstraintManager(); 1696 ConditionTruthVal AllocFailed = CMgr.isNull(state, I.getKey()); 1697 if (AllocFailed.isConstrainedTrue()) 1698 state = state->remove<RegionState>(I.getKey()); 1699 } 1700 1701 // Realloc returns 0 when reallocation fails, which means that we should 1702 // restore the state of the pointer being reallocated. 1703 ReallocPairsTy RP = state->get<ReallocPairs>(); 1704 for (ReallocPairsTy::iterator I = RP.begin(), E = RP.end(); I != E; ++I) { 1705 // If the symbol is assumed to be NULL, remove it from consideration. 1706 ConstraintManager &CMgr = state->getConstraintManager(); 1707 ConditionTruthVal AllocFailed = CMgr.isNull(state, I.getKey()); 1708 if (!AllocFailed.isConstrainedTrue()) 1709 continue; 1710 1711 SymbolRef ReallocSym = I.getData().ReallocatedSym; 1712 if (const RefState *RS = state->get<RegionState>(ReallocSym)) { 1713 if (RS->isReleased()) { 1714 if (I.getData().Kind == RPToBeFreedAfterFailure) 1715 state = state->set<RegionState>(ReallocSym, 1716 RefState::getAllocated(RS->getAllocationFamily(), RS->getStmt())); 1717 else if (I.getData().Kind == RPDoNotTrackAfterFailure) 1718 state = state->remove<RegionState>(ReallocSym); 1719 else 1720 assert(I.getData().Kind == RPIsFreeOnFailure); 1721 } 1722 } 1723 state = state->remove<ReallocPairs>(I.getKey()); 1724 } 1725 1726 return state; 1727} 1728 1729bool MallocChecker::doesNotFreeMemOrInteresting(const CallEvent *Call, 1730 ProgramStateRef State) const { 1731 assert(Call); 1732 1733 // For now, assume that any C++ call can free memory. 1734 // TODO: If we want to be more optimistic here, we'll need to make sure that 1735 // regions escape to C++ containers. They seem to do that even now, but for 1736 // mysterious reasons. 1737 if (!(isa<FunctionCall>(Call) || isa<ObjCMethodCall>(Call))) 1738 return false; 1739 1740 // Check Objective-C messages by selector name. 1741 if (const ObjCMethodCall *Msg = dyn_cast<ObjCMethodCall>(Call)) { 1742 // If it's not a framework call, or if it takes a callback, assume it 1743 // can free memory. 1744 if (!Call->isInSystemHeader() || Call->hasNonZeroCallbackArg()) 1745 return false; 1746 1747 // If it's a method we know about, handle it explicitly post-call. 1748 // This should happen before the "freeWhenDone" check below. 1749 if (isKnownDeallocObjCMethodName(*Msg)) 1750 return true; 1751 1752 // If there's a "freeWhenDone" parameter, but the method isn't one we know 1753 // about, we can't be sure that the object will use free() to deallocate the 1754 // memory, so we can't model it explicitly. The best we can do is use it to 1755 // decide whether the pointer escapes. 1756 if (Optional<bool> FreeWhenDone = getFreeWhenDoneArg(*Msg)) 1757 return !*FreeWhenDone; 1758 1759 // If the first selector piece ends with "NoCopy", and there is no 1760 // "freeWhenDone" parameter set to zero, we know ownership is being 1761 // transferred. Again, though, we can't be sure that the object will use 1762 // free() to deallocate the memory, so we can't model it explicitly. 1763 StringRef FirstSlot = Msg->getSelector().getNameForSlot(0); 1764 if (FirstSlot.endswith("NoCopy")) 1765 return false; 1766 1767 // If the first selector starts with addPointer, insertPointer, 1768 // or replacePointer, assume we are dealing with NSPointerArray or similar. 1769 // This is similar to C++ containers (vector); we still might want to check 1770 // that the pointers get freed by following the container itself. 1771 if (FirstSlot.startswith("addPointer") || 1772 FirstSlot.startswith("insertPointer") || 1773 FirstSlot.startswith("replacePointer")) { 1774 return false; 1775 } 1776 1777 // Otherwise, assume that the method does not free memory. 1778 // Most framework methods do not free memory. 1779 return true; 1780 } 1781 1782 // At this point the only thing left to handle is straight function calls. 1783 const FunctionDecl *FD = cast<FunctionCall>(Call)->getDecl(); 1784 if (!FD) 1785 return false; 1786 1787 ASTContext &ASTC = State->getStateManager().getContext(); 1788 1789 // If it's one of the allocation functions we can reason about, we model 1790 // its behavior explicitly. 1791 if (isMemFunction(FD, ASTC)) 1792 return true; 1793 1794 // If it's not a system call, assume it frees memory. 1795 if (!Call->isInSystemHeader()) 1796 return false; 1797 1798 // White list the system functions whose arguments escape. 1799 const IdentifierInfo *II = FD->getIdentifier(); 1800 if (!II) 1801 return false; 1802 StringRef FName = II->getName(); 1803 1804 // White list the 'XXXNoCopy' CoreFoundation functions. 1805 // We specifically check these before 1806 if (FName.endswith("NoCopy")) { 1807 // Look for the deallocator argument. We know that the memory ownership 1808 // is not transferred only if the deallocator argument is 1809 // 'kCFAllocatorNull'. 1810 for (unsigned i = 1; i < Call->getNumArgs(); ++i) { 1811 const Expr *ArgE = Call->getArgExpr(i)->IgnoreParenCasts(); 1812 if (const DeclRefExpr *DE = dyn_cast<DeclRefExpr>(ArgE)) { 1813 StringRef DeallocatorName = DE->getFoundDecl()->getName(); 1814 if (DeallocatorName == "kCFAllocatorNull") 1815 return true; 1816 } 1817 } 1818 return false; 1819 } 1820 1821 // Associating streams with malloced buffers. The pointer can escape if 1822 // 'closefn' is specified (and if that function does free memory), 1823 // but it will not if closefn is not specified. 1824 // Currently, we do not inspect the 'closefn' function (PR12101). 1825 if (FName == "funopen") 1826 if (Call->getNumArgs() >= 4 && Call->getArgSVal(4).isConstant(0)) 1827 return true; 1828 1829 // Do not warn on pointers passed to 'setbuf' when used with std streams, 1830 // these leaks might be intentional when setting the buffer for stdio. 1831 // http://stackoverflow.com/questions/2671151/who-frees-setvbuf-buffer 1832 if (FName == "setbuf" || FName =="setbuffer" || 1833 FName == "setlinebuf" || FName == "setvbuf") { 1834 if (Call->getNumArgs() >= 1) { 1835 const Expr *ArgE = Call->getArgExpr(0)->IgnoreParenCasts(); 1836 if (const DeclRefExpr *ArgDRE = dyn_cast<DeclRefExpr>(ArgE)) 1837 if (const VarDecl *D = dyn_cast<VarDecl>(ArgDRE->getDecl())) 1838 if (D->getCanonicalDecl()->getName().find("std") != StringRef::npos) 1839 return false; 1840 } 1841 } 1842 1843 // A bunch of other functions which either take ownership of a pointer or 1844 // wrap the result up in a struct or object, meaning it can be freed later. 1845 // (See RetainCountChecker.) Not all the parameters here are invalidated, 1846 // but the Malloc checker cannot differentiate between them. The right way 1847 // of doing this would be to implement a pointer escapes callback. 1848 if (FName == "CGBitmapContextCreate" || 1849 FName == "CGBitmapContextCreateWithData" || 1850 FName == "CVPixelBufferCreateWithBytes" || 1851 FName == "CVPixelBufferCreateWithPlanarBytes" || 1852 FName == "OSAtomicEnqueue") { 1853 return false; 1854 } 1855 1856 // Handle cases where we know a buffer's /address/ can escape. 1857 // Note that the above checks handle some special cases where we know that 1858 // even though the address escapes, it's still our responsibility to free the 1859 // buffer. 1860 if (Call->argumentsMayEscape()) 1861 return false; 1862 1863 // Otherwise, assume that the function does not free memory. 1864 // Most system calls do not free the memory. 1865 return true; 1866} 1867 1868ProgramStateRef MallocChecker::checkPointerEscape(ProgramStateRef State, 1869 const InvalidatedSymbols &Escaped, 1870 const CallEvent *Call, 1871 PointerEscapeKind Kind) const { 1872 // If we know that the call does not free memory, or we want to process the 1873 // call later, keep tracking the top level arguments. 1874 if ((Kind == PSK_DirectEscapeOnCall || 1875 Kind == PSK_IndirectEscapeOnCall) && 1876 doesNotFreeMemOrInteresting(Call, State)) { 1877 return State; 1878 } 1879 1880 for (InvalidatedSymbols::const_iterator I = Escaped.begin(), 1881 E = Escaped.end(); 1882 I != E; ++I) { 1883 SymbolRef sym = *I; 1884 1885 if (const RefState *RS = State->get<RegionState>(sym)) { 1886 if (RS->isAllocated()) 1887 State = State->remove<RegionState>(sym); 1888 } 1889 } 1890 return State; 1891} 1892 1893static SymbolRef findFailedReallocSymbol(ProgramStateRef currState, 1894 ProgramStateRef prevState) { 1895 ReallocPairsTy currMap = currState->get<ReallocPairs>(); 1896 ReallocPairsTy prevMap = prevState->get<ReallocPairs>(); 1897 1898 for (ReallocPairsTy::iterator I = prevMap.begin(), E = prevMap.end(); 1899 I != E; ++I) { 1900 SymbolRef sym = I.getKey(); 1901 if (!currMap.lookup(sym)) 1902 return sym; 1903 } 1904 1905 return NULL; 1906} 1907 1908PathDiagnosticPiece * 1909MallocChecker::MallocBugVisitor::VisitNode(const ExplodedNode *N, 1910 const ExplodedNode *PrevN, 1911 BugReporterContext &BRC, 1912 BugReport &BR) { 1913 ProgramStateRef state = N->getState(); 1914 ProgramStateRef statePrev = PrevN->getState(); 1915 1916 const RefState *RS = state->get<RegionState>(Sym); 1917 const RefState *RSPrev = statePrev->get<RegionState>(Sym); 1918 if (!RS) 1919 return 0; 1920 1921 const Stmt *S = 0; 1922 const char *Msg = 0; 1923 StackHintGeneratorForSymbol *StackHint = 0; 1924 1925 // Retrieve the associated statement. 1926 ProgramPoint ProgLoc = N->getLocation(); 1927 if (Optional<StmtPoint> SP = ProgLoc.getAs<StmtPoint>()) { 1928 S = SP->getStmt(); 1929 } else if (Optional<CallExitEnd> Exit = ProgLoc.getAs<CallExitEnd>()) { 1930 S = Exit->getCalleeContext()->getCallSite(); 1931 } else if (Optional<BlockEdge> Edge = ProgLoc.getAs<BlockEdge>()) { 1932 // If an assumption was made on a branch, it should be caught 1933 // here by looking at the state transition. 1934 S = Edge->getSrc()->getTerminator(); 1935 } 1936 1937 if (!S) 1938 return 0; 1939 1940 // FIXME: We will eventually need to handle non-statement-based events 1941 // (__attribute__((cleanup))). 1942 1943 // Find out if this is an interesting point and what is the kind. 1944 if (Mode == Normal) { 1945 if (isAllocated(RS, RSPrev, S)) { 1946 Msg = "Memory is allocated"; 1947 StackHint = new StackHintGeneratorForSymbol(Sym, 1948 "Returned allocated memory"); 1949 } else if (isReleased(RS, RSPrev, S)) { 1950 Msg = "Memory is released"; 1951 StackHint = new StackHintGeneratorForSymbol(Sym, 1952 "Returned released memory"); 1953 } else if (isRelinquished(RS, RSPrev, S)) { 1954 Msg = "Memory ownership is transfered"; 1955 StackHint = new StackHintGeneratorForSymbol(Sym, ""); 1956 } else if (isReallocFailedCheck(RS, RSPrev, S)) { 1957 Mode = ReallocationFailed; 1958 Msg = "Reallocation failed"; 1959 StackHint = new StackHintGeneratorForReallocationFailed(Sym, 1960 "Reallocation failed"); 1961 1962 if (SymbolRef sym = findFailedReallocSymbol(state, statePrev)) { 1963 // Is it possible to fail two reallocs WITHOUT testing in between? 1964 assert((!FailedReallocSymbol || FailedReallocSymbol == sym) && 1965 "We only support one failed realloc at a time."); 1966 BR.markInteresting(sym); 1967 FailedReallocSymbol = sym; 1968 } 1969 } 1970 1971 // We are in a special mode if a reallocation failed later in the path. 1972 } else if (Mode == ReallocationFailed) { 1973 assert(FailedReallocSymbol && "No symbol to look for."); 1974 1975 // Is this is the first appearance of the reallocated symbol? 1976 if (!statePrev->get<RegionState>(FailedReallocSymbol)) { 1977 // We're at the reallocation point. 1978 Msg = "Attempt to reallocate memory"; 1979 StackHint = new StackHintGeneratorForSymbol(Sym, 1980 "Returned reallocated memory"); 1981 FailedReallocSymbol = NULL; 1982 Mode = Normal; 1983 } 1984 } 1985 1986 if (!Msg) 1987 return 0; 1988 assert(StackHint); 1989 1990 // Generate the extra diagnostic. 1991 PathDiagnosticLocation Pos(S, BRC.getSourceManager(), 1992 N->getLocationContext()); 1993 return new PathDiagnosticEventPiece(Pos, Msg, true, StackHint); 1994} 1995 1996void MallocChecker::printState(raw_ostream &Out, ProgramStateRef State, 1997 const char *NL, const char *Sep) const { 1998 1999 RegionStateTy RS = State->get<RegionState>(); 2000 2001 if (!RS.isEmpty()) { 2002 Out << Sep << "MallocChecker:" << NL; 2003 for (RegionStateTy::iterator I = RS.begin(), E = RS.end(); I != E; ++I) { 2004 I.getKey()->dumpToStream(Out); 2005 Out << " : "; 2006 I.getData().dump(Out); 2007 Out << NL; 2008 } 2009 } 2010} 2011 2012#define REGISTER_CHECKER(name) \ 2013void ento::register##name(CheckerManager &mgr) {\ 2014 registerCStringCheckerBasic(mgr); \ 2015 mgr.registerChecker<MallocChecker>()->Filter.C##name = true;\ 2016} 2017 2018REGISTER_CHECKER(MallocPessimistic) 2019REGISTER_CHECKER(MallocOptimistic) 2020REGISTER_CHECKER(NewDeleteChecker) 2021REGISTER_CHECKER(MismatchedDeallocatorChecker) 2022