Home | History | Annotate | Download | only in Checkers
      1 //==-- RetainCountChecker.cpp - Checks for leaks and other issues -*- 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 the methods for RetainCountChecker, which implements
     11 //  a reference count checker for Core Foundation and Cocoa on (Mac OS X).
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #include "ClangSACheckers.h"
     16 #include "AllocationDiagnostics.h"
     17 #include "SelectorExtras.h"
     18 #include "clang/AST/Attr.h"
     19 #include "clang/AST/DeclCXX.h"
     20 #include "clang/AST/DeclObjC.h"
     21 #include "clang/AST/ParentMap.h"
     22 #include "clang/Analysis/DomainSpecific/CocoaConventions.h"
     23 #include "clang/Basic/LangOptions.h"
     24 #include "clang/Basic/SourceManager.h"
     25 #include "clang/StaticAnalyzer/Checkers/ObjCRetainCount.h"
     26 #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
     27 #include "clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h"
     28 #include "clang/StaticAnalyzer/Core/Checker.h"
     29 #include "clang/StaticAnalyzer/Core/CheckerManager.h"
     30 #include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h"
     31 #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
     32 #include "clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h"
     33 #include "clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h"
     34 #include "llvm/ADT/DenseMap.h"
     35 #include "llvm/ADT/FoldingSet.h"
     36 #include "llvm/ADT/ImmutableList.h"
     37 #include "llvm/ADT/ImmutableMap.h"
     38 #include "llvm/ADT/STLExtras.h"
     39 #include "llvm/ADT/SmallString.h"
     40 #include "llvm/ADT/StringExtras.h"
     41 #include <cstdarg>
     42 
     43 using namespace clang;
     44 using namespace ento;
     45 using namespace objc_retain;
     46 using llvm::StrInStrNoCase;
     47 
     48 //===----------------------------------------------------------------------===//
     49 // Adapters for FoldingSet.
     50 //===----------------------------------------------------------------------===//
     51 
     52 namespace llvm {
     53 template <> struct FoldingSetTrait<ArgEffect> {
     54 static inline void Profile(const ArgEffect X, FoldingSetNodeID &ID) {
     55   ID.AddInteger((unsigned) X);
     56 }
     57 };
     58 template <> struct FoldingSetTrait<RetEffect> {
     59   static inline void Profile(const RetEffect &X, FoldingSetNodeID &ID) {
     60     ID.AddInteger((unsigned) X.getKind());
     61     ID.AddInteger((unsigned) X.getObjKind());
     62 }
     63 };
     64 } // end llvm namespace
     65 
     66 //===----------------------------------------------------------------------===//
     67 // Reference-counting logic (typestate + counts).
     68 //===----------------------------------------------------------------------===//
     69 
     70 /// ArgEffects summarizes the effects of a function/method call on all of
     71 /// its arguments.
     72 typedef llvm::ImmutableMap<unsigned,ArgEffect> ArgEffects;
     73 
     74 namespace {
     75 class RefVal {
     76 public:
     77   enum Kind {
     78     Owned = 0, // Owning reference.
     79     NotOwned,  // Reference is not owned by still valid (not freed).
     80     Released,  // Object has been released.
     81     ReturnedOwned, // Returned object passes ownership to caller.
     82     ReturnedNotOwned, // Return object does not pass ownership to caller.
     83     ERROR_START,
     84     ErrorDeallocNotOwned, // -dealloc called on non-owned object.
     85     ErrorDeallocGC, // Calling -dealloc with GC enabled.
     86     ErrorUseAfterRelease, // Object used after released.
     87     ErrorReleaseNotOwned, // Release of an object that was not owned.
     88     ERROR_LEAK_START,
     89     ErrorLeak,  // A memory leak due to excessive reference counts.
     90     ErrorLeakReturned, // A memory leak due to the returning method not having
     91                        // the correct naming conventions.
     92     ErrorGCLeakReturned,
     93     ErrorOverAutorelease,
     94     ErrorReturnedNotOwned
     95   };
     96 
     97   /// Tracks how an object referenced by an ivar has been used.
     98   ///
     99   /// This accounts for us not knowing if an arbitrary ivar is supposed to be
    100   /// stored at +0 or +1.
    101   enum class IvarAccessHistory {
    102     None,
    103     AccessedDirectly,
    104     ReleasedAfterDirectAccess
    105   };
    106 
    107 private:
    108   /// The number of outstanding retains.
    109   unsigned Cnt;
    110   /// The number of outstanding autoreleases.
    111   unsigned ACnt;
    112   /// The (static) type of the object at the time we started tracking it.
    113   QualType T;
    114 
    115   /// The current state of the object.
    116   ///
    117   /// See the RefVal::Kind enum for possible values.
    118   unsigned RawKind : 5;
    119 
    120   /// The kind of object being tracked (CF or ObjC), if known.
    121   ///
    122   /// See the RetEffect::ObjKind enum for possible values.
    123   unsigned RawObjectKind : 2;
    124 
    125   /// True if the current state and/or retain count may turn out to not be the
    126   /// best possible approximation of the reference counting state.
    127   ///
    128   /// If true, the checker may decide to throw away ("override") this state
    129   /// in favor of something else when it sees the object being used in new ways.
    130   ///
    131   /// This setting should not be propagated to state derived from this state.
    132   /// Once we start deriving new states, it would be inconsistent to override
    133   /// them.
    134   unsigned RawIvarAccessHistory : 2;
    135 
    136   RefVal(Kind k, RetEffect::ObjKind o, unsigned cnt, unsigned acnt, QualType t,
    137          IvarAccessHistory IvarAccess)
    138     : Cnt(cnt), ACnt(acnt), T(t), RawKind(static_cast<unsigned>(k)),
    139       RawObjectKind(static_cast<unsigned>(o)),
    140       RawIvarAccessHistory(static_cast<unsigned>(IvarAccess)) {
    141     assert(getKind() == k && "not enough bits for the kind");
    142     assert(getObjKind() == o && "not enough bits for the object kind");
    143     assert(getIvarAccessHistory() == IvarAccess && "not enough bits");
    144   }
    145 
    146 public:
    147   Kind getKind() const { return static_cast<Kind>(RawKind); }
    148 
    149   RetEffect::ObjKind getObjKind() const {
    150     return static_cast<RetEffect::ObjKind>(RawObjectKind);
    151   }
    152 
    153   unsigned getCount() const { return Cnt; }
    154   unsigned getAutoreleaseCount() const { return ACnt; }
    155   unsigned getCombinedCounts() const { return Cnt + ACnt; }
    156   void clearCounts() {
    157     Cnt = 0;
    158     ACnt = 0;
    159   }
    160   void setCount(unsigned i) {
    161     Cnt = i;
    162   }
    163   void setAutoreleaseCount(unsigned i) {
    164     ACnt = i;
    165   }
    166 
    167   QualType getType() const { return T; }
    168 
    169   /// Returns what the analyzer knows about direct accesses to a particular
    170   /// instance variable.
    171   ///
    172   /// If the object with this refcount wasn't originally from an Objective-C
    173   /// ivar region, this should always return IvarAccessHistory::None.
    174   IvarAccessHistory getIvarAccessHistory() const {
    175     return static_cast<IvarAccessHistory>(RawIvarAccessHistory);
    176   }
    177 
    178   bool isOwned() const {
    179     return getKind() == Owned;
    180   }
    181 
    182   bool isNotOwned() const {
    183     return getKind() == NotOwned;
    184   }
    185 
    186   bool isReturnedOwned() const {
    187     return getKind() == ReturnedOwned;
    188   }
    189 
    190   bool isReturnedNotOwned() const {
    191     return getKind() == ReturnedNotOwned;
    192   }
    193 
    194   /// Create a state for an object whose lifetime is the responsibility of the
    195   /// current function, at least partially.
    196   ///
    197   /// Most commonly, this is an owned object with a retain count of +1.
    198   static RefVal makeOwned(RetEffect::ObjKind o, QualType t,
    199                           unsigned Count = 1) {
    200     return RefVal(Owned, o, Count, 0, t, IvarAccessHistory::None);
    201   }
    202 
    203   /// Create a state for an object whose lifetime is not the responsibility of
    204   /// the current function.
    205   ///
    206   /// Most commonly, this is an unowned object with a retain count of +0.
    207   static RefVal makeNotOwned(RetEffect::ObjKind o, QualType t,
    208                              unsigned Count = 0) {
    209     return RefVal(NotOwned, o, Count, 0, t, IvarAccessHistory::None);
    210   }
    211 
    212   RefVal operator-(size_t i) const {
    213     return RefVal(getKind(), getObjKind(), getCount() - i,
    214                   getAutoreleaseCount(), getType(), getIvarAccessHistory());
    215   }
    216 
    217   RefVal operator+(size_t i) const {
    218     return RefVal(getKind(), getObjKind(), getCount() + i,
    219                   getAutoreleaseCount(), getType(), getIvarAccessHistory());
    220   }
    221 
    222   RefVal operator^(Kind k) const {
    223     return RefVal(k, getObjKind(), getCount(), getAutoreleaseCount(),
    224                   getType(), getIvarAccessHistory());
    225   }
    226 
    227   RefVal autorelease() const {
    228     return RefVal(getKind(), getObjKind(), getCount(), getAutoreleaseCount()+1,
    229                   getType(), getIvarAccessHistory());
    230   }
    231 
    232   RefVal withIvarAccess() const {
    233     assert(getIvarAccessHistory() == IvarAccessHistory::None);
    234     return RefVal(getKind(), getObjKind(), getCount(), getAutoreleaseCount(),
    235                   getType(), IvarAccessHistory::AccessedDirectly);
    236   }
    237 
    238   RefVal releaseViaIvar() const {
    239     assert(getIvarAccessHistory() == IvarAccessHistory::AccessedDirectly);
    240     return RefVal(getKind(), getObjKind(), getCount(), getAutoreleaseCount(),
    241                   getType(), IvarAccessHistory::ReleasedAfterDirectAccess);
    242   }
    243 
    244   // Comparison, profiling, and pretty-printing.
    245 
    246   bool hasSameState(const RefVal &X) const {
    247     return getKind() == X.getKind() && Cnt == X.Cnt && ACnt == X.ACnt &&
    248            getIvarAccessHistory() == X.getIvarAccessHistory();
    249   }
    250 
    251   bool operator==(const RefVal& X) const {
    252     return T == X.T && hasSameState(X) && getObjKind() == X.getObjKind();
    253   }
    254 
    255   void Profile(llvm::FoldingSetNodeID& ID) const {
    256     ID.Add(T);
    257     ID.AddInteger(RawKind);
    258     ID.AddInteger(Cnt);
    259     ID.AddInteger(ACnt);
    260     ID.AddInteger(RawObjectKind);
    261     ID.AddInteger(RawIvarAccessHistory);
    262   }
    263 
    264   void print(raw_ostream &Out) const;
    265 };
    266 
    267 void RefVal::print(raw_ostream &Out) const {
    268   if (!T.isNull())
    269     Out << "Tracked " << T.getAsString() << '/';
    270 
    271   switch (getKind()) {
    272     default: llvm_unreachable("Invalid RefVal kind");
    273     case Owned: {
    274       Out << "Owned";
    275       unsigned cnt = getCount();
    276       if (cnt) Out << " (+ " << cnt << ")";
    277       break;
    278     }
    279 
    280     case NotOwned: {
    281       Out << "NotOwned";
    282       unsigned cnt = getCount();
    283       if (cnt) Out << " (+ " << cnt << ")";
    284       break;
    285     }
    286 
    287     case ReturnedOwned: {
    288       Out << "ReturnedOwned";
    289       unsigned cnt = getCount();
    290       if (cnt) Out << " (+ " << cnt << ")";
    291       break;
    292     }
    293 
    294     case ReturnedNotOwned: {
    295       Out << "ReturnedNotOwned";
    296       unsigned cnt = getCount();
    297       if (cnt) Out << " (+ " << cnt << ")";
    298       break;
    299     }
    300 
    301     case Released:
    302       Out << "Released";
    303       break;
    304 
    305     case ErrorDeallocGC:
    306       Out << "-dealloc (GC)";
    307       break;
    308 
    309     case ErrorDeallocNotOwned:
    310       Out << "-dealloc (not-owned)";
    311       break;
    312 
    313     case ErrorLeak:
    314       Out << "Leaked";
    315       break;
    316 
    317     case ErrorLeakReturned:
    318       Out << "Leaked (Bad naming)";
    319       break;
    320 
    321     case ErrorGCLeakReturned:
    322       Out << "Leaked (GC-ed at return)";
    323       break;
    324 
    325     case ErrorUseAfterRelease:
    326       Out << "Use-After-Release [ERROR]";
    327       break;
    328 
    329     case ErrorReleaseNotOwned:
    330       Out << "Release of Not-Owned [ERROR]";
    331       break;
    332 
    333     case RefVal::ErrorOverAutorelease:
    334       Out << "Over-autoreleased";
    335       break;
    336 
    337     case RefVal::ErrorReturnedNotOwned:
    338       Out << "Non-owned object returned instead of owned";
    339       break;
    340   }
    341 
    342   switch (getIvarAccessHistory()) {
    343   case IvarAccessHistory::None:
    344     break;
    345   case IvarAccessHistory::AccessedDirectly:
    346     Out << " [direct ivar access]";
    347     break;
    348   case IvarAccessHistory::ReleasedAfterDirectAccess:
    349     Out << " [released after direct ivar access]";
    350   }
    351 
    352   if (ACnt) {
    353     Out << " [autorelease -" << ACnt << ']';
    354   }
    355 }
    356 } //end anonymous namespace
    357 
    358 //===----------------------------------------------------------------------===//
    359 // RefBindings - State used to track object reference counts.
    360 //===----------------------------------------------------------------------===//
    361 
    362 REGISTER_MAP_WITH_PROGRAMSTATE(RefBindings, SymbolRef, RefVal)
    363 
    364 static inline const RefVal *getRefBinding(ProgramStateRef State,
    365                                           SymbolRef Sym) {
    366   return State->get<RefBindings>(Sym);
    367 }
    368 
    369 static inline ProgramStateRef setRefBinding(ProgramStateRef State,
    370                                             SymbolRef Sym, RefVal Val) {
    371   return State->set<RefBindings>(Sym, Val);
    372 }
    373 
    374 static ProgramStateRef removeRefBinding(ProgramStateRef State, SymbolRef Sym) {
    375   return State->remove<RefBindings>(Sym);
    376 }
    377 
    378 //===----------------------------------------------------------------------===//
    379 // Function/Method behavior summaries.
    380 //===----------------------------------------------------------------------===//
    381 
    382 namespace {
    383 class RetainSummary {
    384   /// Args - a map of (index, ArgEffect) pairs, where index
    385   ///  specifies the argument (starting from 0).  This can be sparsely
    386   ///  populated; arguments with no entry in Args use 'DefaultArgEffect'.
    387   ArgEffects Args;
    388 
    389   /// DefaultArgEffect - The default ArgEffect to apply to arguments that
    390   ///  do not have an entry in Args.
    391   ArgEffect DefaultArgEffect;
    392 
    393   /// Receiver - If this summary applies to an Objective-C message expression,
    394   ///  this is the effect applied to the state of the receiver.
    395   ArgEffect Receiver;
    396 
    397   /// Ret - The effect on the return value.  Used to indicate if the
    398   ///  function/method call returns a new tracked symbol.
    399   RetEffect Ret;
    400 
    401 public:
    402   RetainSummary(ArgEffects A, RetEffect R, ArgEffect defaultEff,
    403                 ArgEffect ReceiverEff)
    404     : Args(A), DefaultArgEffect(defaultEff), Receiver(ReceiverEff), Ret(R) {}
    405 
    406   /// getArg - Return the argument effect on the argument specified by
    407   ///  idx (starting from 0).
    408   ArgEffect getArg(unsigned idx) const {
    409     if (const ArgEffect *AE = Args.lookup(idx))
    410       return *AE;
    411 
    412     return DefaultArgEffect;
    413   }
    414 
    415   void addArg(ArgEffects::Factory &af, unsigned idx, ArgEffect e) {
    416     Args = af.add(Args, idx, e);
    417   }
    418 
    419   /// setDefaultArgEffect - Set the default argument effect.
    420   void setDefaultArgEffect(ArgEffect E) {
    421     DefaultArgEffect = E;
    422   }
    423 
    424   /// getRetEffect - Returns the effect on the return value of the call.
    425   RetEffect getRetEffect() const { return Ret; }
    426 
    427   /// setRetEffect - Set the effect of the return value of the call.
    428   void setRetEffect(RetEffect E) { Ret = E; }
    429 
    430 
    431   /// Sets the effect on the receiver of the message.
    432   void setReceiverEffect(ArgEffect e) { Receiver = e; }
    433 
    434   /// getReceiverEffect - Returns the effect on the receiver of the call.
    435   ///  This is only meaningful if the summary applies to an ObjCMessageExpr*.
    436   ArgEffect getReceiverEffect() const { return Receiver; }
    437 
    438   /// Test if two retain summaries are identical. Note that merely equivalent
    439   /// summaries are not necessarily identical (for example, if an explicit
    440   /// argument effect matches the default effect).
    441   bool operator==(const RetainSummary &Other) const {
    442     return Args == Other.Args && DefaultArgEffect == Other.DefaultArgEffect &&
    443            Receiver == Other.Receiver && Ret == Other.Ret;
    444   }
    445 
    446   /// Profile this summary for inclusion in a FoldingSet.
    447   void Profile(llvm::FoldingSetNodeID& ID) const {
    448     ID.Add(Args);
    449     ID.Add(DefaultArgEffect);
    450     ID.Add(Receiver);
    451     ID.Add(Ret);
    452   }
    453 
    454   /// A retain summary is simple if it has no ArgEffects other than the default.
    455   bool isSimple() const {
    456     return Args.isEmpty();
    457   }
    458 
    459 private:
    460   ArgEffects getArgEffects() const { return Args; }
    461   ArgEffect getDefaultArgEffect() const { return DefaultArgEffect; }
    462 
    463   friend class RetainSummaryManager;
    464 };
    465 } // end anonymous namespace
    466 
    467 //===----------------------------------------------------------------------===//
    468 // Data structures for constructing summaries.
    469 //===----------------------------------------------------------------------===//
    470 
    471 namespace {
    472 class ObjCSummaryKey {
    473   IdentifierInfo* II;
    474   Selector S;
    475 public:
    476   ObjCSummaryKey(IdentifierInfo* ii, Selector s)
    477     : II(ii), S(s) {}
    478 
    479   ObjCSummaryKey(const ObjCInterfaceDecl *d, Selector s)
    480     : II(d ? d->getIdentifier() : nullptr), S(s) {}
    481 
    482   ObjCSummaryKey(Selector s)
    483     : II(nullptr), S(s) {}
    484 
    485   IdentifierInfo *getIdentifier() const { return II; }
    486   Selector getSelector() const { return S; }
    487 };
    488 } // end anonymous namespace
    489 
    490 namespace llvm {
    491 template <> struct DenseMapInfo<ObjCSummaryKey> {
    492   static inline ObjCSummaryKey getEmptyKey() {
    493     return ObjCSummaryKey(DenseMapInfo<IdentifierInfo*>::getEmptyKey(),
    494                           DenseMapInfo<Selector>::getEmptyKey());
    495   }
    496 
    497   static inline ObjCSummaryKey getTombstoneKey() {
    498     return ObjCSummaryKey(DenseMapInfo<IdentifierInfo*>::getTombstoneKey(),
    499                           DenseMapInfo<Selector>::getTombstoneKey());
    500   }
    501 
    502   static unsigned getHashValue(const ObjCSummaryKey &V) {
    503     typedef std::pair<IdentifierInfo*, Selector> PairTy;
    504     return DenseMapInfo<PairTy>::getHashValue(PairTy(V.getIdentifier(),
    505                                                      V.getSelector()));
    506   }
    507 
    508   static bool isEqual(const ObjCSummaryKey& LHS, const ObjCSummaryKey& RHS) {
    509     return LHS.getIdentifier() == RHS.getIdentifier() &&
    510            LHS.getSelector() == RHS.getSelector();
    511   }
    512 
    513 };
    514 } // end llvm namespace
    515 
    516 namespace {
    517 class ObjCSummaryCache {
    518   typedef llvm::DenseMap<ObjCSummaryKey, const RetainSummary *> MapTy;
    519   MapTy M;
    520 public:
    521   ObjCSummaryCache() {}
    522 
    523   const RetainSummary * find(const ObjCInterfaceDecl *D, Selector S) {
    524     // Do a lookup with the (D,S) pair.  If we find a match return
    525     // the iterator.
    526     ObjCSummaryKey K(D, S);
    527     MapTy::iterator I = M.find(K);
    528 
    529     if (I != M.end())
    530       return I->second;
    531     if (!D)
    532       return nullptr;
    533 
    534     // Walk the super chain.  If we find a hit with a parent, we'll end
    535     // up returning that summary.  We actually allow that key (null,S), as
    536     // we cache summaries for the null ObjCInterfaceDecl* to allow us to
    537     // generate initial summaries without having to worry about NSObject
    538     // being declared.
    539     // FIXME: We may change this at some point.
    540     for (ObjCInterfaceDecl *C=D->getSuperClass() ;; C=C->getSuperClass()) {
    541       if ((I = M.find(ObjCSummaryKey(C, S))) != M.end())
    542         break;
    543 
    544       if (!C)
    545         return nullptr;
    546     }
    547 
    548     // Cache the summary with original key to make the next lookup faster
    549     // and return the iterator.
    550     const RetainSummary *Summ = I->second;
    551     M[K] = Summ;
    552     return Summ;
    553   }
    554 
    555   const RetainSummary *find(IdentifierInfo* II, Selector S) {
    556     // FIXME: Class method lookup.  Right now we dont' have a good way
    557     // of going between IdentifierInfo* and the class hierarchy.
    558     MapTy::iterator I = M.find(ObjCSummaryKey(II, S));
    559 
    560     if (I == M.end())
    561       I = M.find(ObjCSummaryKey(S));
    562 
    563     return I == M.end() ? nullptr : I->second;
    564   }
    565 
    566   const RetainSummary *& operator[](ObjCSummaryKey K) {
    567     return M[K];
    568   }
    569 
    570   const RetainSummary *& operator[](Selector S) {
    571     return M[ ObjCSummaryKey(S) ];
    572   }
    573 };
    574 } // end anonymous namespace
    575 
    576 //===----------------------------------------------------------------------===//
    577 // Data structures for managing collections of summaries.
    578 //===----------------------------------------------------------------------===//
    579 
    580 namespace {
    581 class RetainSummaryManager {
    582 
    583   //==-----------------------------------------------------------------==//
    584   //  Typedefs.
    585   //==-----------------------------------------------------------------==//
    586 
    587   typedef llvm::DenseMap<const FunctionDecl*, const RetainSummary *>
    588           FuncSummariesTy;
    589 
    590   typedef ObjCSummaryCache ObjCMethodSummariesTy;
    591 
    592   typedef llvm::FoldingSetNodeWrapper<RetainSummary> CachedSummaryNode;
    593 
    594   //==-----------------------------------------------------------------==//
    595   //  Data.
    596   //==-----------------------------------------------------------------==//
    597 
    598   /// Ctx - The ASTContext object for the analyzed ASTs.
    599   ASTContext &Ctx;
    600 
    601   /// GCEnabled - Records whether or not the analyzed code runs in GC mode.
    602   const bool GCEnabled;
    603 
    604   /// Records whether or not the analyzed code runs in ARC mode.
    605   const bool ARCEnabled;
    606 
    607   /// FuncSummaries - A map from FunctionDecls to summaries.
    608   FuncSummariesTy FuncSummaries;
    609 
    610   /// ObjCClassMethodSummaries - A map from selectors (for instance methods)
    611   ///  to summaries.
    612   ObjCMethodSummariesTy ObjCClassMethodSummaries;
    613 
    614   /// ObjCMethodSummaries - A map from selectors to summaries.
    615   ObjCMethodSummariesTy ObjCMethodSummaries;
    616 
    617   /// BPAlloc - A BumpPtrAllocator used for allocating summaries, ArgEffects,
    618   ///  and all other data used by the checker.
    619   llvm::BumpPtrAllocator BPAlloc;
    620 
    621   /// AF - A factory for ArgEffects objects.
    622   ArgEffects::Factory AF;
    623 
    624   /// ScratchArgs - A holding buffer for construct ArgEffects.
    625   ArgEffects ScratchArgs;
    626 
    627   /// ObjCAllocRetE - Default return effect for methods returning Objective-C
    628   ///  objects.
    629   RetEffect ObjCAllocRetE;
    630 
    631   /// ObjCInitRetE - Default return effect for init methods returning
    632   ///   Objective-C objects.
    633   RetEffect ObjCInitRetE;
    634 
    635   /// SimpleSummaries - Used for uniquing summaries that don't have special
    636   /// effects.
    637   llvm::FoldingSet<CachedSummaryNode> SimpleSummaries;
    638 
    639   //==-----------------------------------------------------------------==//
    640   //  Methods.
    641   //==-----------------------------------------------------------------==//
    642 
    643   /// getArgEffects - Returns a persistent ArgEffects object based on the
    644   ///  data in ScratchArgs.
    645   ArgEffects getArgEffects();
    646 
    647   enum UnaryFuncKind { cfretain, cfrelease, cfautorelease, cfmakecollectable };
    648 
    649   const RetainSummary *getUnarySummary(const FunctionType* FT,
    650                                        UnaryFuncKind func);
    651 
    652   const RetainSummary *getCFSummaryCreateRule(const FunctionDecl *FD);
    653   const RetainSummary *getCFSummaryGetRule(const FunctionDecl *FD);
    654   const RetainSummary *getCFCreateGetRuleSummary(const FunctionDecl *FD);
    655 
    656   const RetainSummary *getPersistentSummary(const RetainSummary &OldSumm);
    657 
    658   const RetainSummary *getPersistentSummary(RetEffect RetEff,
    659                                             ArgEffect ReceiverEff = DoNothing,
    660                                             ArgEffect DefaultEff = MayEscape) {
    661     RetainSummary Summ(getArgEffects(), RetEff, DefaultEff, ReceiverEff);
    662     return getPersistentSummary(Summ);
    663   }
    664 
    665   const RetainSummary *getDoNothingSummary() {
    666     return getPersistentSummary(RetEffect::MakeNoRet(), DoNothing, DoNothing);
    667   }
    668 
    669   const RetainSummary *getDefaultSummary() {
    670     return getPersistentSummary(RetEffect::MakeNoRet(),
    671                                 DoNothing, MayEscape);
    672   }
    673 
    674   const RetainSummary *getPersistentStopSummary() {
    675     return getPersistentSummary(RetEffect::MakeNoRet(),
    676                                 StopTracking, StopTracking);
    677   }
    678 
    679   void InitializeClassMethodSummaries();
    680   void InitializeMethodSummaries();
    681 private:
    682   void addNSObjectClsMethSummary(Selector S, const RetainSummary *Summ) {
    683     ObjCClassMethodSummaries[S] = Summ;
    684   }
    685 
    686   void addNSObjectMethSummary(Selector S, const RetainSummary *Summ) {
    687     ObjCMethodSummaries[S] = Summ;
    688   }
    689 
    690   void addClassMethSummary(const char* Cls, const char* name,
    691                            const RetainSummary *Summ, bool isNullary = true) {
    692     IdentifierInfo* ClsII = &Ctx.Idents.get(Cls);
    693     Selector S = isNullary ? GetNullarySelector(name, Ctx)
    694                            : GetUnarySelector(name, Ctx);
    695     ObjCClassMethodSummaries[ObjCSummaryKey(ClsII, S)]  = Summ;
    696   }
    697 
    698   void addInstMethSummary(const char* Cls, const char* nullaryName,
    699                           const RetainSummary *Summ) {
    700     IdentifierInfo* ClsII = &Ctx.Idents.get(Cls);
    701     Selector S = GetNullarySelector(nullaryName, Ctx);
    702     ObjCMethodSummaries[ObjCSummaryKey(ClsII, S)]  = Summ;
    703   }
    704 
    705   void addMethodSummary(IdentifierInfo *ClsII, ObjCMethodSummariesTy &Summaries,
    706                         const RetainSummary *Summ, va_list argp) {
    707     Selector S = getKeywordSelector(Ctx, argp);
    708     Summaries[ObjCSummaryKey(ClsII, S)] = Summ;
    709   }
    710 
    711   void addInstMethSummary(const char* Cls, const RetainSummary * Summ, ...) {
    712     va_list argp;
    713     va_start(argp, Summ);
    714     addMethodSummary(&Ctx.Idents.get(Cls), ObjCMethodSummaries, Summ, argp);
    715     va_end(argp);
    716   }
    717 
    718   void addClsMethSummary(const char* Cls, const RetainSummary * Summ, ...) {
    719     va_list argp;
    720     va_start(argp, Summ);
    721     addMethodSummary(&Ctx.Idents.get(Cls),ObjCClassMethodSummaries, Summ, argp);
    722     va_end(argp);
    723   }
    724 
    725   void addClsMethSummary(IdentifierInfo *II, const RetainSummary * Summ, ...) {
    726     va_list argp;
    727     va_start(argp, Summ);
    728     addMethodSummary(II, ObjCClassMethodSummaries, Summ, argp);
    729     va_end(argp);
    730   }
    731 
    732 public:
    733 
    734   RetainSummaryManager(ASTContext &ctx, bool gcenabled, bool usesARC)
    735    : Ctx(ctx),
    736      GCEnabled(gcenabled),
    737      ARCEnabled(usesARC),
    738      AF(BPAlloc), ScratchArgs(AF.getEmptyMap()),
    739      ObjCAllocRetE(gcenabled
    740                     ? RetEffect::MakeGCNotOwned()
    741                     : (usesARC ? RetEffect::MakeNotOwned(RetEffect::ObjC)
    742                                : RetEffect::MakeOwned(RetEffect::ObjC, true))),
    743      ObjCInitRetE(gcenabled
    744                     ? RetEffect::MakeGCNotOwned()
    745                     : (usesARC ? RetEffect::MakeNotOwned(RetEffect::ObjC)
    746                                : RetEffect::MakeOwnedWhenTrackedReceiver())) {
    747     InitializeClassMethodSummaries();
    748     InitializeMethodSummaries();
    749   }
    750 
    751   const RetainSummary *getSummary(const CallEvent &Call,
    752                                   ProgramStateRef State = nullptr);
    753 
    754   const RetainSummary *getFunctionSummary(const FunctionDecl *FD);
    755 
    756   const RetainSummary *getMethodSummary(Selector S, const ObjCInterfaceDecl *ID,
    757                                         const ObjCMethodDecl *MD,
    758                                         QualType RetTy,
    759                                         ObjCMethodSummariesTy &CachedSummaries);
    760 
    761   const RetainSummary *getInstanceMethodSummary(const ObjCMethodCall &M,
    762                                                 ProgramStateRef State);
    763 
    764   const RetainSummary *getClassMethodSummary(const ObjCMethodCall &M) {
    765     assert(!M.isInstanceMessage());
    766     const ObjCInterfaceDecl *Class = M.getReceiverInterface();
    767 
    768     return getMethodSummary(M.getSelector(), Class, M.getDecl(),
    769                             M.getResultType(), ObjCClassMethodSummaries);
    770   }
    771 
    772   /// getMethodSummary - This version of getMethodSummary is used to query
    773   ///  the summary for the current method being analyzed.
    774   const RetainSummary *getMethodSummary(const ObjCMethodDecl *MD) {
    775     const ObjCInterfaceDecl *ID = MD->getClassInterface();
    776     Selector S = MD->getSelector();
    777     QualType ResultTy = MD->getReturnType();
    778 
    779     ObjCMethodSummariesTy *CachedSummaries;
    780     if (MD->isInstanceMethod())
    781       CachedSummaries = &ObjCMethodSummaries;
    782     else
    783       CachedSummaries = &ObjCClassMethodSummaries;
    784 
    785     return getMethodSummary(S, ID, MD, ResultTy, *CachedSummaries);
    786   }
    787 
    788   const RetainSummary *getStandardMethodSummary(const ObjCMethodDecl *MD,
    789                                                 Selector S, QualType RetTy);
    790 
    791   /// Determine if there is a special return effect for this function or method.
    792   Optional<RetEffect> getRetEffectFromAnnotations(QualType RetTy,
    793                                                   const Decl *D);
    794 
    795   void updateSummaryFromAnnotations(const RetainSummary *&Summ,
    796                                     const ObjCMethodDecl *MD);
    797 
    798   void updateSummaryFromAnnotations(const RetainSummary *&Summ,
    799                                     const FunctionDecl *FD);
    800 
    801   void updateSummaryForCall(const RetainSummary *&Summ,
    802                             const CallEvent &Call);
    803 
    804   bool isGCEnabled() const { return GCEnabled; }
    805 
    806   bool isARCEnabled() const { return ARCEnabled; }
    807 
    808   bool isARCorGCEnabled() const { return GCEnabled || ARCEnabled; }
    809 
    810   RetEffect getObjAllocRetEffect() const { return ObjCAllocRetE; }
    811 
    812   friend class RetainSummaryTemplate;
    813 };
    814 
    815 // Used to avoid allocating long-term (BPAlloc'd) memory for default retain
    816 // summaries. If a function or method looks like it has a default summary, but
    817 // it has annotations, the annotations are added to the stack-based template
    818 // and then copied into managed memory.
    819 class RetainSummaryTemplate {
    820   RetainSummaryManager &Manager;
    821   const RetainSummary *&RealSummary;
    822   RetainSummary ScratchSummary;
    823   bool Accessed;
    824 public:
    825   RetainSummaryTemplate(const RetainSummary *&real, RetainSummaryManager &mgr)
    826     : Manager(mgr), RealSummary(real), ScratchSummary(*real), Accessed(false) {}
    827 
    828   ~RetainSummaryTemplate() {
    829     if (Accessed)
    830       RealSummary = Manager.getPersistentSummary(ScratchSummary);
    831   }
    832 
    833   RetainSummary &operator*() {
    834     Accessed = true;
    835     return ScratchSummary;
    836   }
    837 
    838   RetainSummary *operator->() {
    839     Accessed = true;
    840     return &ScratchSummary;
    841   }
    842 };
    843 
    844 } // end anonymous namespace
    845 
    846 //===----------------------------------------------------------------------===//
    847 // Implementation of checker data structures.
    848 //===----------------------------------------------------------------------===//
    849 
    850 ArgEffects RetainSummaryManager::getArgEffects() {
    851   ArgEffects AE = ScratchArgs;
    852   ScratchArgs = AF.getEmptyMap();
    853   return AE;
    854 }
    855 
    856 const RetainSummary *
    857 RetainSummaryManager::getPersistentSummary(const RetainSummary &OldSumm) {
    858   // Unique "simple" summaries -- those without ArgEffects.
    859   if (OldSumm.isSimple()) {
    860     llvm::FoldingSetNodeID ID;
    861     OldSumm.Profile(ID);
    862 
    863     void *Pos;
    864     CachedSummaryNode *N = SimpleSummaries.FindNodeOrInsertPos(ID, Pos);
    865 
    866     if (!N) {
    867       N = (CachedSummaryNode *) BPAlloc.Allocate<CachedSummaryNode>();
    868       new (N) CachedSummaryNode(OldSumm);
    869       SimpleSummaries.InsertNode(N, Pos);
    870     }
    871 
    872     return &N->getValue();
    873   }
    874 
    875   RetainSummary *Summ = (RetainSummary *) BPAlloc.Allocate<RetainSummary>();
    876   new (Summ) RetainSummary(OldSumm);
    877   return Summ;
    878 }
    879 
    880 //===----------------------------------------------------------------------===//
    881 // Summary creation for functions (largely uses of Core Foundation).
    882 //===----------------------------------------------------------------------===//
    883 
    884 static bool isRetain(const FunctionDecl *FD, StringRef FName) {
    885   return FName.endswith("Retain");
    886 }
    887 
    888 static bool isRelease(const FunctionDecl *FD, StringRef FName) {
    889   return FName.endswith("Release");
    890 }
    891 
    892 static bool isAutorelease(const FunctionDecl *FD, StringRef FName) {
    893   return FName.endswith("Autorelease");
    894 }
    895 
    896 static bool isMakeCollectable(const FunctionDecl *FD, StringRef FName) {
    897   // FIXME: Remove FunctionDecl parameter.
    898   // FIXME: Is it really okay if MakeCollectable isn't a suffix?
    899   return FName.find("MakeCollectable") != StringRef::npos;
    900 }
    901 
    902 static ArgEffect getStopTrackingHardEquivalent(ArgEffect E) {
    903   switch (E) {
    904   case DoNothing:
    905   case Autorelease:
    906   case DecRefBridgedTransferred:
    907   case IncRef:
    908   case IncRefMsg:
    909   case MakeCollectable:
    910   case UnretainedOutParameter:
    911   case RetainedOutParameter:
    912   case MayEscape:
    913   case StopTracking:
    914   case StopTrackingHard:
    915     return StopTrackingHard;
    916   case DecRef:
    917   case DecRefAndStopTrackingHard:
    918     return DecRefAndStopTrackingHard;
    919   case DecRefMsg:
    920   case DecRefMsgAndStopTrackingHard:
    921     return DecRefMsgAndStopTrackingHard;
    922   case Dealloc:
    923     return Dealloc;
    924   }
    925 
    926   llvm_unreachable("Unknown ArgEffect kind");
    927 }
    928 
    929 void RetainSummaryManager::updateSummaryForCall(const RetainSummary *&S,
    930                                                 const CallEvent &Call) {
    931   if (Call.hasNonZeroCallbackArg()) {
    932     ArgEffect RecEffect =
    933       getStopTrackingHardEquivalent(S->getReceiverEffect());
    934     ArgEffect DefEffect =
    935       getStopTrackingHardEquivalent(S->getDefaultArgEffect());
    936 
    937     ArgEffects CustomArgEffects = S->getArgEffects();
    938     for (ArgEffects::iterator I = CustomArgEffects.begin(),
    939                               E = CustomArgEffects.end();
    940          I != E; ++I) {
    941       ArgEffect Translated = getStopTrackingHardEquivalent(I->second);
    942       if (Translated != DefEffect)
    943         ScratchArgs = AF.add(ScratchArgs, I->first, Translated);
    944     }
    945 
    946     RetEffect RE = RetEffect::MakeNoRetHard();
    947 
    948     // Special cases where the callback argument CANNOT free the return value.
    949     // This can generally only happen if we know that the callback will only be
    950     // called when the return value is already being deallocated.
    951     if (const SimpleFunctionCall *FC = dyn_cast<SimpleFunctionCall>(&Call)) {
    952       if (IdentifierInfo *Name = FC->getDecl()->getIdentifier()) {
    953         // When the CGBitmapContext is deallocated, the callback here will free
    954         // the associated data buffer.
    955         if (Name->isStr("CGBitmapContextCreateWithData"))
    956           RE = S->getRetEffect();
    957       }
    958     }
    959 
    960     S = getPersistentSummary(RE, RecEffect, DefEffect);
    961   }
    962 
    963   // Special case '[super init];' and '[self init];'
    964   //
    965   // Even though calling '[super init]' without assigning the result to self
    966   // and checking if the parent returns 'nil' is a bad pattern, it is common.
    967   // Additionally, our Self Init checker already warns about it. To avoid
    968   // overwhelming the user with messages from both checkers, we model the case
    969   // of '[super init]' in cases when it is not consumed by another expression
    970   // as if the call preserves the value of 'self'; essentially, assuming it can
    971   // never fail and return 'nil'.
    972   // Note, we don't want to just stop tracking the value since we want the
    973   // RetainCount checker to report leaks and use-after-free if SelfInit checker
    974   // is turned off.
    975   if (const ObjCMethodCall *MC = dyn_cast<ObjCMethodCall>(&Call)) {
    976     if (MC->getMethodFamily() == OMF_init && MC->isReceiverSelfOrSuper()) {
    977 
    978       // Check if the message is not consumed, we know it will not be used in
    979       // an assignment, ex: "self = [super init]".
    980       const Expr *ME = MC->getOriginExpr();
    981       const LocationContext *LCtx = MC->getLocationContext();
    982       ParentMap &PM = LCtx->getAnalysisDeclContext()->getParentMap();
    983       if (!PM.isConsumedExpr(ME)) {
    984         RetainSummaryTemplate ModifiableSummaryTemplate(S, *this);
    985         ModifiableSummaryTemplate->setReceiverEffect(DoNothing);
    986         ModifiableSummaryTemplate->setRetEffect(RetEffect::MakeNoRet());
    987       }
    988     }
    989   }
    990 }
    991 
    992 const RetainSummary *
    993 RetainSummaryManager::getSummary(const CallEvent &Call,
    994                                  ProgramStateRef State) {
    995   const RetainSummary *Summ;
    996   switch (Call.getKind()) {
    997   case CE_Function:
    998     Summ = getFunctionSummary(cast<SimpleFunctionCall>(Call).getDecl());
    999     break;
   1000   case CE_CXXMember:
   1001   case CE_CXXMemberOperator:
   1002   case CE_Block:
   1003   case CE_CXXConstructor:
   1004   case CE_CXXDestructor:
   1005   case CE_CXXAllocator:
   1006     // FIXME: These calls are currently unsupported.
   1007     return getPersistentStopSummary();
   1008   case CE_ObjCMessage: {
   1009     const ObjCMethodCall &Msg = cast<ObjCMethodCall>(Call);
   1010     if (Msg.isInstanceMessage())
   1011       Summ = getInstanceMethodSummary(Msg, State);
   1012     else
   1013       Summ = getClassMethodSummary(Msg);
   1014     break;
   1015   }
   1016   }
   1017 
   1018   updateSummaryForCall(Summ, Call);
   1019 
   1020   assert(Summ && "Unknown call type?");
   1021   return Summ;
   1022 }
   1023 
   1024 const RetainSummary *
   1025 RetainSummaryManager::getFunctionSummary(const FunctionDecl *FD) {
   1026   // If we don't know what function we're calling, use our default summary.
   1027   if (!FD)
   1028     return getDefaultSummary();
   1029 
   1030   // Look up a summary in our cache of FunctionDecls -> Summaries.
   1031   FuncSummariesTy::iterator I = FuncSummaries.find(FD);
   1032   if (I != FuncSummaries.end())
   1033     return I->second;
   1034 
   1035   // No summary?  Generate one.
   1036   const RetainSummary *S = nullptr;
   1037   bool AllowAnnotations = true;
   1038 
   1039   do {
   1040     // We generate "stop" summaries for implicitly defined functions.
   1041     if (FD->isImplicit()) {
   1042       S = getPersistentStopSummary();
   1043       break;
   1044     }
   1045 
   1046     // [PR 3337] Use 'getAs<FunctionType>' to strip away any typedefs on the
   1047     // function's type.
   1048     const FunctionType* FT = FD->getType()->getAs<FunctionType>();
   1049     const IdentifierInfo *II = FD->getIdentifier();
   1050     if (!II)
   1051       break;
   1052 
   1053     StringRef FName = II->getName();
   1054 
   1055     // Strip away preceding '_'.  Doing this here will effect all the checks
   1056     // down below.
   1057     FName = FName.substr(FName.find_first_not_of('_'));
   1058 
   1059     // Inspect the result type.
   1060     QualType RetTy = FT->getReturnType();
   1061 
   1062     // FIXME: This should all be refactored into a chain of "summary lookup"
   1063     //  filters.
   1064     assert(ScratchArgs.isEmpty());
   1065 
   1066     if (FName == "pthread_create" || FName == "pthread_setspecific") {
   1067       // Part of: <rdar://problem/7299394> and <rdar://problem/11282706>.
   1068       // This will be addressed better with IPA.
   1069       S = getPersistentStopSummary();
   1070     } else if (FName == "NSMakeCollectable") {
   1071       // Handle: id NSMakeCollectable(CFTypeRef)
   1072       S = (RetTy->isObjCIdType())
   1073           ? getUnarySummary(FT, cfmakecollectable)
   1074           : getPersistentStopSummary();
   1075       // The headers on OS X 10.8 use cf_consumed/ns_returns_retained,
   1076       // but we can fully model NSMakeCollectable ourselves.
   1077       AllowAnnotations = false;
   1078     } else if (FName == "CFPlugInInstanceCreate") {
   1079       S = getPersistentSummary(RetEffect::MakeNoRet());
   1080     } else if (FName == "IOBSDNameMatching" ||
   1081                FName == "IOServiceMatching" ||
   1082                FName == "IOServiceNameMatching" ||
   1083                FName == "IORegistryEntrySearchCFProperty" ||
   1084                FName == "IORegistryEntryIDMatching" ||
   1085                FName == "IOOpenFirmwarePathMatching") {
   1086       // Part of <rdar://problem/6961230>. (IOKit)
   1087       // This should be addressed using a API table.
   1088       S = getPersistentSummary(RetEffect::MakeOwned(RetEffect::CF, true),
   1089                                DoNothing, DoNothing);
   1090     } else if (FName == "IOServiceGetMatchingService" ||
   1091                FName == "IOServiceGetMatchingServices") {
   1092       // FIXES: <rdar://problem/6326900>
   1093       // This should be addressed using a API table.  This strcmp is also
   1094       // a little gross, but there is no need to super optimize here.
   1095       ScratchArgs = AF.add(ScratchArgs, 1, DecRef);
   1096       S = getPersistentSummary(RetEffect::MakeNoRet(), DoNothing, DoNothing);
   1097     } else if (FName == "IOServiceAddNotification" ||
   1098                FName == "IOServiceAddMatchingNotification") {
   1099       // Part of <rdar://problem/6961230>. (IOKit)
   1100       // This should be addressed using a API table.
   1101       ScratchArgs = AF.add(ScratchArgs, 2, DecRef);
   1102       S = getPersistentSummary(RetEffect::MakeNoRet(), DoNothing, DoNothing);
   1103     } else if (FName == "CVPixelBufferCreateWithBytes") {
   1104       // FIXES: <rdar://problem/7283567>
   1105       // Eventually this can be improved by recognizing that the pixel
   1106       // buffer passed to CVPixelBufferCreateWithBytes is released via
   1107       // a callback and doing full IPA to make sure this is done correctly.
   1108       // FIXME: This function has an out parameter that returns an
   1109       // allocated object.
   1110       ScratchArgs = AF.add(ScratchArgs, 7, StopTracking);
   1111       S = getPersistentSummary(RetEffect::MakeNoRet(), DoNothing, DoNothing);
   1112     } else if (FName == "CGBitmapContextCreateWithData") {
   1113       // FIXES: <rdar://problem/7358899>
   1114       // Eventually this can be improved by recognizing that 'releaseInfo'
   1115       // passed to CGBitmapContextCreateWithData is released via
   1116       // a callback and doing full IPA to make sure this is done correctly.
   1117       ScratchArgs = AF.add(ScratchArgs, 8, StopTracking);
   1118       S = getPersistentSummary(RetEffect::MakeOwned(RetEffect::CF, true),
   1119                                DoNothing, DoNothing);
   1120     } else if (FName == "CVPixelBufferCreateWithPlanarBytes") {
   1121       // FIXES: <rdar://problem/7283567>
   1122       // Eventually this can be improved by recognizing that the pixel
   1123       // buffer passed to CVPixelBufferCreateWithPlanarBytes is released
   1124       // via a callback and doing full IPA to make sure this is done
   1125       // correctly.
   1126       ScratchArgs = AF.add(ScratchArgs, 12, StopTracking);
   1127       S = getPersistentSummary(RetEffect::MakeNoRet(), DoNothing, DoNothing);
   1128     } else if (FName == "dispatch_set_context" ||
   1129                FName == "xpc_connection_set_context") {
   1130       // <rdar://problem/11059275> - The analyzer currently doesn't have
   1131       // a good way to reason about the finalizer function for libdispatch.
   1132       // If we pass a context object that is memory managed, stop tracking it.
   1133       // <rdar://problem/13783514> - Same problem, but for XPC.
   1134       // FIXME: this hack should possibly go away once we can handle
   1135       // libdispatch and XPC finalizers.
   1136       ScratchArgs = AF.add(ScratchArgs, 1, StopTracking);
   1137       S = getPersistentSummary(RetEffect::MakeNoRet(), DoNothing, DoNothing);
   1138     } else if (FName.startswith("NSLog")) {
   1139       S = getDoNothingSummary();
   1140     } else if (FName.startswith("NS") &&
   1141                 (FName.find("Insert") != StringRef::npos)) {
   1142       // Whitelist NSXXInsertXX, for example NSMapInsertIfAbsent, since they can
   1143       // be deallocated by NSMapRemove. (radar://11152419)
   1144       ScratchArgs = AF.add(ScratchArgs, 1, StopTracking);
   1145       ScratchArgs = AF.add(ScratchArgs, 2, StopTracking);
   1146       S = getPersistentSummary(RetEffect::MakeNoRet(), DoNothing, DoNothing);
   1147     }
   1148 
   1149     // Did we get a summary?
   1150     if (S)
   1151       break;
   1152 
   1153     if (RetTy->isPointerType()) {
   1154       // For CoreFoundation ('CF') types.
   1155       if (cocoa::isRefType(RetTy, "CF", FName)) {
   1156         if (isRetain(FD, FName)) {
   1157           S = getUnarySummary(FT, cfretain);
   1158         } else if (isAutorelease(FD, FName)) {
   1159           S = getUnarySummary(FT, cfautorelease);
   1160           // The headers use cf_consumed, but we can fully model CFAutorelease
   1161           // ourselves.
   1162           AllowAnnotations = false;
   1163         } else if (isMakeCollectable(FD, FName)) {
   1164           S = getUnarySummary(FT, cfmakecollectable);
   1165           AllowAnnotations = false;
   1166         } else {
   1167           S = getCFCreateGetRuleSummary(FD);
   1168         }
   1169 
   1170         break;
   1171       }
   1172 
   1173       // For CoreGraphics ('CG') types.
   1174       if (cocoa::isRefType(RetTy, "CG", FName)) {
   1175         if (isRetain(FD, FName))
   1176           S = getUnarySummary(FT, cfretain);
   1177         else
   1178           S = getCFCreateGetRuleSummary(FD);
   1179 
   1180         break;
   1181       }
   1182 
   1183       // For the Disk Arbitration API (DiskArbitration/DADisk.h)
   1184       if (cocoa::isRefType(RetTy, "DADisk") ||
   1185           cocoa::isRefType(RetTy, "DADissenter") ||
   1186           cocoa::isRefType(RetTy, "DASessionRef")) {
   1187         S = getCFCreateGetRuleSummary(FD);
   1188         break;
   1189       }
   1190 
   1191       if (FD->hasAttr<CFAuditedTransferAttr>()) {
   1192         S = getCFCreateGetRuleSummary(FD);
   1193         break;
   1194       }
   1195 
   1196       break;
   1197     }
   1198 
   1199     // Check for release functions, the only kind of functions that we care
   1200     // about that don't return a pointer type.
   1201     if (FName[0] == 'C' && (FName[1] == 'F' || FName[1] == 'G')) {
   1202       // Test for 'CGCF'.
   1203       FName = FName.substr(FName.startswith("CGCF") ? 4 : 2);
   1204 
   1205       if (isRelease(FD, FName))
   1206         S = getUnarySummary(FT, cfrelease);
   1207       else {
   1208         assert (ScratchArgs.isEmpty());
   1209         // Remaining CoreFoundation and CoreGraphics functions.
   1210         // We use to assume that they all strictly followed the ownership idiom
   1211         // and that ownership cannot be transferred.  While this is technically
   1212         // correct, many methods allow a tracked object to escape.  For example:
   1213         //
   1214         //   CFMutableDictionaryRef x = CFDictionaryCreateMutable(...);
   1215         //   CFDictionaryAddValue(y, key, x);
   1216         //   CFRelease(x);
   1217         //   ... it is okay to use 'x' since 'y' has a reference to it
   1218         //
   1219         // We handle this and similar cases with the follow heuristic.  If the
   1220         // function name contains "InsertValue", "SetValue", "AddValue",
   1221         // "AppendValue", or "SetAttribute", then we assume that arguments may
   1222         // "escape."  This means that something else holds on to the object,
   1223         // allowing it be used even after its local retain count drops to 0.
   1224         ArgEffect E = (StrInStrNoCase(FName, "InsertValue") != StringRef::npos||
   1225                        StrInStrNoCase(FName, "AddValue") != StringRef::npos ||
   1226                        StrInStrNoCase(FName, "SetValue") != StringRef::npos ||
   1227                        StrInStrNoCase(FName, "AppendValue") != StringRef::npos||
   1228                        StrInStrNoCase(FName, "SetAttribute") != StringRef::npos)
   1229                       ? MayEscape : DoNothing;
   1230 
   1231         S = getPersistentSummary(RetEffect::MakeNoRet(), DoNothing, E);
   1232       }
   1233     }
   1234   }
   1235   while (0);
   1236 
   1237   // If we got all the way here without any luck, use a default summary.
   1238   if (!S)
   1239     S = getDefaultSummary();
   1240 
   1241   // Annotations override defaults.
   1242   if (AllowAnnotations)
   1243     updateSummaryFromAnnotations(S, FD);
   1244 
   1245   FuncSummaries[FD] = S;
   1246   return S;
   1247 }
   1248 
   1249 const RetainSummary *
   1250 RetainSummaryManager::getCFCreateGetRuleSummary(const FunctionDecl *FD) {
   1251   if (coreFoundation::followsCreateRule(FD))
   1252     return getCFSummaryCreateRule(FD);
   1253 
   1254   return getCFSummaryGetRule(FD);
   1255 }
   1256 
   1257 const RetainSummary *
   1258 RetainSummaryManager::getUnarySummary(const FunctionType* FT,
   1259                                       UnaryFuncKind func) {
   1260 
   1261   // Sanity check that this is *really* a unary function.  This can
   1262   // happen if people do weird things.
   1263   const FunctionProtoType* FTP = dyn_cast<FunctionProtoType>(FT);
   1264   if (!FTP || FTP->getNumParams() != 1)
   1265     return getPersistentStopSummary();
   1266 
   1267   assert (ScratchArgs.isEmpty());
   1268 
   1269   ArgEffect Effect;
   1270   switch (func) {
   1271   case cfretain: Effect = IncRef; break;
   1272   case cfrelease: Effect = DecRef; break;
   1273   case cfautorelease: Effect = Autorelease; break;
   1274   case cfmakecollectable: Effect = MakeCollectable; break;
   1275   }
   1276 
   1277   ScratchArgs = AF.add(ScratchArgs, 0, Effect);
   1278   return getPersistentSummary(RetEffect::MakeNoRet(), DoNothing, DoNothing);
   1279 }
   1280 
   1281 const RetainSummary *
   1282 RetainSummaryManager::getCFSummaryCreateRule(const FunctionDecl *FD) {
   1283   assert (ScratchArgs.isEmpty());
   1284 
   1285   return getPersistentSummary(RetEffect::MakeOwned(RetEffect::CF, true));
   1286 }
   1287 
   1288 const RetainSummary *
   1289 RetainSummaryManager::getCFSummaryGetRule(const FunctionDecl *FD) {
   1290   assert (ScratchArgs.isEmpty());
   1291   return getPersistentSummary(RetEffect::MakeNotOwned(RetEffect::CF),
   1292                               DoNothing, DoNothing);
   1293 }
   1294 
   1295 //===----------------------------------------------------------------------===//
   1296 // Summary creation for Selectors.
   1297 //===----------------------------------------------------------------------===//
   1298 
   1299 Optional<RetEffect>
   1300 RetainSummaryManager::getRetEffectFromAnnotations(QualType RetTy,
   1301                                                   const Decl *D) {
   1302   if (cocoa::isCocoaObjectRef(RetTy)) {
   1303     if (D->hasAttr<NSReturnsRetainedAttr>())
   1304       return ObjCAllocRetE;
   1305 
   1306     if (D->hasAttr<NSReturnsNotRetainedAttr>() ||
   1307         D->hasAttr<NSReturnsAutoreleasedAttr>())
   1308       return RetEffect::MakeNotOwned(RetEffect::ObjC);
   1309 
   1310   } else if (!RetTy->isPointerType()) {
   1311     return None;
   1312   }
   1313 
   1314   if (D->hasAttr<CFReturnsRetainedAttr>())
   1315     return RetEffect::MakeOwned(RetEffect::CF, true);
   1316 
   1317   if (D->hasAttr<CFReturnsNotRetainedAttr>())
   1318     return RetEffect::MakeNotOwned(RetEffect::CF);
   1319 
   1320   return None;
   1321 }
   1322 
   1323 void
   1324 RetainSummaryManager::updateSummaryFromAnnotations(const RetainSummary *&Summ,
   1325                                                    const FunctionDecl *FD) {
   1326   if (!FD)
   1327     return;
   1328 
   1329   assert(Summ && "Must have a summary to add annotations to.");
   1330   RetainSummaryTemplate Template(Summ, *this);
   1331 
   1332   // Effects on the parameters.
   1333   unsigned parm_idx = 0;
   1334   for (FunctionDecl::param_const_iterator pi = FD->param_begin(),
   1335          pe = FD->param_end(); pi != pe; ++pi, ++parm_idx) {
   1336     const ParmVarDecl *pd = *pi;
   1337     if (pd->hasAttr<NSConsumedAttr>())
   1338       Template->addArg(AF, parm_idx, DecRefMsg);
   1339     else if (pd->hasAttr<CFConsumedAttr>())
   1340       Template->addArg(AF, parm_idx, DecRef);
   1341     else if (pd->hasAttr<CFReturnsRetainedAttr>()) {
   1342       QualType PointeeTy = pd->getType()->getPointeeType();
   1343       if (!PointeeTy.isNull())
   1344         if (coreFoundation::isCFObjectRef(PointeeTy))
   1345           Template->addArg(AF, parm_idx, RetainedOutParameter);
   1346     } else if (pd->hasAttr<CFReturnsNotRetainedAttr>()) {
   1347       QualType PointeeTy = pd->getType()->getPointeeType();
   1348       if (!PointeeTy.isNull())
   1349         if (coreFoundation::isCFObjectRef(PointeeTy))
   1350           Template->addArg(AF, parm_idx, UnretainedOutParameter);
   1351     }
   1352   }
   1353 
   1354   QualType RetTy = FD->getReturnType();
   1355   if (Optional<RetEffect> RetE = getRetEffectFromAnnotations(RetTy, FD))
   1356     Template->setRetEffect(*RetE);
   1357 }
   1358 
   1359 void
   1360 RetainSummaryManager::updateSummaryFromAnnotations(const RetainSummary *&Summ,
   1361                                                    const ObjCMethodDecl *MD) {
   1362   if (!MD)
   1363     return;
   1364 
   1365   assert(Summ && "Must have a valid summary to add annotations to");
   1366   RetainSummaryTemplate Template(Summ, *this);
   1367 
   1368   // Effects on the receiver.
   1369   if (MD->hasAttr<NSConsumesSelfAttr>())
   1370     Template->setReceiverEffect(DecRefMsg);
   1371 
   1372   // Effects on the parameters.
   1373   unsigned parm_idx = 0;
   1374   for (ObjCMethodDecl::param_const_iterator
   1375          pi=MD->param_begin(), pe=MD->param_end();
   1376        pi != pe; ++pi, ++parm_idx) {
   1377     const ParmVarDecl *pd = *pi;
   1378     if (pd->hasAttr<NSConsumedAttr>())
   1379       Template->addArg(AF, parm_idx, DecRefMsg);
   1380     else if (pd->hasAttr<CFConsumedAttr>()) {
   1381       Template->addArg(AF, parm_idx, DecRef);
   1382     } else if (pd->hasAttr<CFReturnsRetainedAttr>()) {
   1383       QualType PointeeTy = pd->getType()->getPointeeType();
   1384       if (!PointeeTy.isNull())
   1385         if (coreFoundation::isCFObjectRef(PointeeTy))
   1386           Template->addArg(AF, parm_idx, RetainedOutParameter);
   1387     } else if (pd->hasAttr<CFReturnsNotRetainedAttr>()) {
   1388       QualType PointeeTy = pd->getType()->getPointeeType();
   1389       if (!PointeeTy.isNull())
   1390         if (coreFoundation::isCFObjectRef(PointeeTy))
   1391           Template->addArg(AF, parm_idx, UnretainedOutParameter);
   1392     }
   1393   }
   1394 
   1395   QualType RetTy = MD->getReturnType();
   1396   if (Optional<RetEffect> RetE = getRetEffectFromAnnotations(RetTy, MD))
   1397     Template->setRetEffect(*RetE);
   1398 }
   1399 
   1400 const RetainSummary *
   1401 RetainSummaryManager::getStandardMethodSummary(const ObjCMethodDecl *MD,
   1402                                                Selector S, QualType RetTy) {
   1403   // Any special effects?
   1404   ArgEffect ReceiverEff = DoNothing;
   1405   RetEffect ResultEff = RetEffect::MakeNoRet();
   1406 
   1407   // Check the method family, and apply any default annotations.
   1408   switch (MD ? MD->getMethodFamily() : S.getMethodFamily()) {
   1409     case OMF_None:
   1410     case OMF_initialize:
   1411     case OMF_performSelector:
   1412       // Assume all Objective-C methods follow Cocoa Memory Management rules.
   1413       // FIXME: Does the non-threaded performSelector family really belong here?
   1414       // The selector could be, say, @selector(copy).
   1415       if (cocoa::isCocoaObjectRef(RetTy))
   1416         ResultEff = RetEffect::MakeNotOwned(RetEffect::ObjC);
   1417       else if (coreFoundation::isCFObjectRef(RetTy)) {
   1418         // ObjCMethodDecl currently doesn't consider CF objects as valid return
   1419         // values for alloc, new, copy, or mutableCopy, so we have to
   1420         // double-check with the selector. This is ugly, but there aren't that
   1421         // many Objective-C methods that return CF objects, right?
   1422         if (MD) {
   1423           switch (S.getMethodFamily()) {
   1424           case OMF_alloc:
   1425           case OMF_new:
   1426           case OMF_copy:
   1427           case OMF_mutableCopy:
   1428             ResultEff = RetEffect::MakeOwned(RetEffect::CF, true);
   1429             break;
   1430           default:
   1431             ResultEff = RetEffect::MakeNotOwned(RetEffect::CF);
   1432             break;
   1433           }
   1434         } else {
   1435           ResultEff = RetEffect::MakeNotOwned(RetEffect::CF);
   1436         }
   1437       }
   1438       break;
   1439     case OMF_init:
   1440       ResultEff = ObjCInitRetE;
   1441       ReceiverEff = DecRefMsg;
   1442       break;
   1443     case OMF_alloc:
   1444     case OMF_new:
   1445     case OMF_copy:
   1446     case OMF_mutableCopy:
   1447       if (cocoa::isCocoaObjectRef(RetTy))
   1448         ResultEff = ObjCAllocRetE;
   1449       else if (coreFoundation::isCFObjectRef(RetTy))
   1450         ResultEff = RetEffect::MakeOwned(RetEffect::CF, true);
   1451       break;
   1452     case OMF_autorelease:
   1453       ReceiverEff = Autorelease;
   1454       break;
   1455     case OMF_retain:
   1456       ReceiverEff = IncRefMsg;
   1457       break;
   1458     case OMF_release:
   1459       ReceiverEff = DecRefMsg;
   1460       break;
   1461     case OMF_dealloc:
   1462       ReceiverEff = Dealloc;
   1463       break;
   1464     case OMF_self:
   1465       // -self is handled specially by the ExprEngine to propagate the receiver.
   1466       break;
   1467     case OMF_retainCount:
   1468     case OMF_finalize:
   1469       // These methods don't return objects.
   1470       break;
   1471   }
   1472 
   1473   // If one of the arguments in the selector has the keyword 'delegate' we
   1474   // should stop tracking the reference count for the receiver.  This is
   1475   // because the reference count is quite possibly handled by a delegate
   1476   // method.
   1477   if (S.isKeywordSelector()) {
   1478     for (unsigned i = 0, e = S.getNumArgs(); i != e; ++i) {
   1479       StringRef Slot = S.getNameForSlot(i);
   1480       if (Slot.substr(Slot.size() - 8).equals_lower("delegate")) {
   1481         if (ResultEff == ObjCInitRetE)
   1482           ResultEff = RetEffect::MakeNoRetHard();
   1483         else
   1484           ReceiverEff = StopTrackingHard;
   1485       }
   1486     }
   1487   }
   1488 
   1489   if (ScratchArgs.isEmpty() && ReceiverEff == DoNothing &&
   1490       ResultEff.getKind() == RetEffect::NoRet)
   1491     return getDefaultSummary();
   1492 
   1493   return getPersistentSummary(ResultEff, ReceiverEff, MayEscape);
   1494 }
   1495 
   1496 const RetainSummary *
   1497 RetainSummaryManager::getInstanceMethodSummary(const ObjCMethodCall &Msg,
   1498                                                ProgramStateRef State) {
   1499   const ObjCInterfaceDecl *ReceiverClass = nullptr;
   1500 
   1501   // We do better tracking of the type of the object than the core ExprEngine.
   1502   // See if we have its type in our private state.
   1503   // FIXME: Eventually replace the use of state->get<RefBindings> with
   1504   // a generic API for reasoning about the Objective-C types of symbolic
   1505   // objects.
   1506   SVal ReceiverV = Msg.getReceiverSVal();
   1507   if (SymbolRef Sym = ReceiverV.getAsLocSymbol())
   1508     if (const RefVal *T = getRefBinding(State, Sym))
   1509       if (const ObjCObjectPointerType *PT =
   1510             T->getType()->getAs<ObjCObjectPointerType>())
   1511         ReceiverClass = PT->getInterfaceDecl();
   1512 
   1513   // If we don't know what kind of object this is, fall back to its static type.
   1514   if (!ReceiverClass)
   1515     ReceiverClass = Msg.getReceiverInterface();
   1516 
   1517   // FIXME: The receiver could be a reference to a class, meaning that
   1518   //  we should use the class method.
   1519   // id x = [NSObject class];
   1520   // [x performSelector:... withObject:... afterDelay:...];
   1521   Selector S = Msg.getSelector();
   1522   const ObjCMethodDecl *Method = Msg.getDecl();
   1523   if (!Method && ReceiverClass)
   1524     Method = ReceiverClass->getInstanceMethod(S);
   1525 
   1526   return getMethodSummary(S, ReceiverClass, Method, Msg.getResultType(),
   1527                           ObjCMethodSummaries);
   1528 }
   1529 
   1530 const RetainSummary *
   1531 RetainSummaryManager::getMethodSummary(Selector S, const ObjCInterfaceDecl *ID,
   1532                                        const ObjCMethodDecl *MD, QualType RetTy,
   1533                                        ObjCMethodSummariesTy &CachedSummaries) {
   1534 
   1535   // Look up a summary in our summary cache.
   1536   const RetainSummary *Summ = CachedSummaries.find(ID, S);
   1537 
   1538   if (!Summ) {
   1539     Summ = getStandardMethodSummary(MD, S, RetTy);
   1540 
   1541     // Annotations override defaults.
   1542     updateSummaryFromAnnotations(Summ, MD);
   1543 
   1544     // Memoize the summary.
   1545     CachedSummaries[ObjCSummaryKey(ID, S)] = Summ;
   1546   }
   1547 
   1548   return Summ;
   1549 }
   1550 
   1551 void RetainSummaryManager::InitializeClassMethodSummaries() {
   1552   assert(ScratchArgs.isEmpty());
   1553   // Create the [NSAssertionHandler currentHander] summary.
   1554   addClassMethSummary("NSAssertionHandler", "currentHandler",
   1555                 getPersistentSummary(RetEffect::MakeNotOwned(RetEffect::ObjC)));
   1556 
   1557   // Create the [NSAutoreleasePool addObject:] summary.
   1558   ScratchArgs = AF.add(ScratchArgs, 0, Autorelease);
   1559   addClassMethSummary("NSAutoreleasePool", "addObject",
   1560                       getPersistentSummary(RetEffect::MakeNoRet(),
   1561                                            DoNothing, Autorelease));
   1562 }
   1563 
   1564 void RetainSummaryManager::InitializeMethodSummaries() {
   1565 
   1566   assert (ScratchArgs.isEmpty());
   1567 
   1568   // Create the "init" selector.  It just acts as a pass-through for the
   1569   // receiver.
   1570   const RetainSummary *InitSumm = getPersistentSummary(ObjCInitRetE, DecRefMsg);
   1571   addNSObjectMethSummary(GetNullarySelector("init", Ctx), InitSumm);
   1572 
   1573   // awakeAfterUsingCoder: behaves basically like an 'init' method.  It
   1574   // claims the receiver and returns a retained object.
   1575   addNSObjectMethSummary(GetUnarySelector("awakeAfterUsingCoder", Ctx),
   1576                          InitSumm);
   1577 
   1578   // The next methods are allocators.
   1579   const RetainSummary *AllocSumm = getPersistentSummary(ObjCAllocRetE);
   1580   const RetainSummary *CFAllocSumm =
   1581     getPersistentSummary(RetEffect::MakeOwned(RetEffect::CF, true));
   1582 
   1583   // Create the "retain" selector.
   1584   RetEffect NoRet = RetEffect::MakeNoRet();
   1585   const RetainSummary *Summ = getPersistentSummary(NoRet, IncRefMsg);
   1586   addNSObjectMethSummary(GetNullarySelector("retain", Ctx), Summ);
   1587 
   1588   // Create the "release" selector.
   1589   Summ = getPersistentSummary(NoRet, DecRefMsg);
   1590   addNSObjectMethSummary(GetNullarySelector("release", Ctx), Summ);
   1591 
   1592   // Create the -dealloc summary.
   1593   Summ = getPersistentSummary(NoRet, Dealloc);
   1594   addNSObjectMethSummary(GetNullarySelector("dealloc", Ctx), Summ);
   1595 
   1596   // Create the "autorelease" selector.
   1597   Summ = getPersistentSummary(NoRet, Autorelease);
   1598   addNSObjectMethSummary(GetNullarySelector("autorelease", Ctx), Summ);
   1599 
   1600   // For NSWindow, allocated objects are (initially) self-owned.
   1601   // FIXME: For now we opt for false negatives with NSWindow, as these objects
   1602   //  self-own themselves.  However, they only do this once they are displayed.
   1603   //  Thus, we need to track an NSWindow's display status.
   1604   //  This is tracked in <rdar://problem/6062711>.
   1605   //  See also http://llvm.org/bugs/show_bug.cgi?id=3714.
   1606   const RetainSummary *NoTrackYet = getPersistentSummary(RetEffect::MakeNoRet(),
   1607                                                    StopTracking,
   1608                                                    StopTracking);
   1609 
   1610   addClassMethSummary("NSWindow", "alloc", NoTrackYet);
   1611 
   1612   // For NSPanel (which subclasses NSWindow), allocated objects are not
   1613   //  self-owned.
   1614   // FIXME: For now we don't track NSPanels. object for the same reason
   1615   //   as for NSWindow objects.
   1616   addClassMethSummary("NSPanel", "alloc", NoTrackYet);
   1617 
   1618   // For NSNull, objects returned by +null are singletons that ignore
   1619   // retain/release semantics.  Just don't track them.
   1620   // <rdar://problem/12858915>
   1621   addClassMethSummary("NSNull", "null", NoTrackYet);
   1622 
   1623   // Don't track allocated autorelease pools, as it is okay to prematurely
   1624   // exit a method.
   1625   addClassMethSummary("NSAutoreleasePool", "alloc", NoTrackYet);
   1626   addClassMethSummary("NSAutoreleasePool", "allocWithZone", NoTrackYet, false);
   1627   addClassMethSummary("NSAutoreleasePool", "new", NoTrackYet);
   1628 
   1629   // Create summaries QCRenderer/QCView -createSnapShotImageOfType:
   1630   addInstMethSummary("QCRenderer", AllocSumm,
   1631                      "createSnapshotImageOfType", nullptr);
   1632   addInstMethSummary("QCView", AllocSumm,
   1633                      "createSnapshotImageOfType", nullptr);
   1634 
   1635   // Create summaries for CIContext, 'createCGImage' and
   1636   // 'createCGLayerWithSize'.  These objects are CF objects, and are not
   1637   // automatically garbage collected.
   1638   addInstMethSummary("CIContext", CFAllocSumm,
   1639                      "createCGImage", "fromRect", nullptr);
   1640   addInstMethSummary("CIContext", CFAllocSumm, "createCGImage", "fromRect",
   1641                      "format", "colorSpace", nullptr);
   1642   addInstMethSummary("CIContext", CFAllocSumm, "createCGLayerWithSize", "info",
   1643                      nullptr);
   1644 }
   1645 
   1646 //===----------------------------------------------------------------------===//
   1647 // Error reporting.
   1648 //===----------------------------------------------------------------------===//
   1649 namespace {
   1650   typedef llvm::DenseMap<const ExplodedNode *, const RetainSummary *>
   1651     SummaryLogTy;
   1652 
   1653   //===-------------===//
   1654   // Bug Descriptions. //
   1655   //===-------------===//
   1656 
   1657   class CFRefBug : public BugType {
   1658   protected:
   1659     CFRefBug(const CheckerBase *checker, StringRef name)
   1660         : BugType(checker, name, categories::MemoryCoreFoundationObjectiveC) {}
   1661 
   1662   public:
   1663 
   1664     // FIXME: Eventually remove.
   1665     virtual const char *getDescription() const = 0;
   1666 
   1667     virtual bool isLeak() const { return false; }
   1668   };
   1669 
   1670   class UseAfterRelease : public CFRefBug {
   1671   public:
   1672     UseAfterRelease(const CheckerBase *checker)
   1673         : CFRefBug(checker, "Use-after-release") {}
   1674 
   1675     const char *getDescription() const override {
   1676       return "Reference-counted object is used after it is released";
   1677     }
   1678   };
   1679 
   1680   class BadRelease : public CFRefBug {
   1681   public:
   1682     BadRelease(const CheckerBase *checker) : CFRefBug(checker, "Bad release") {}
   1683 
   1684     const char *getDescription() const override {
   1685       return "Incorrect decrement of the reference count of an object that is "
   1686              "not owned at this point by the caller";
   1687     }
   1688   };
   1689 
   1690   class DeallocGC : public CFRefBug {
   1691   public:
   1692     DeallocGC(const CheckerBase *checker)
   1693         : CFRefBug(checker, "-dealloc called while using garbage collection") {}
   1694 
   1695     const char *getDescription() const override {
   1696       return "-dealloc called while using garbage collection";
   1697     }
   1698   };
   1699 
   1700   class DeallocNotOwned : public CFRefBug {
   1701   public:
   1702     DeallocNotOwned(const CheckerBase *checker)
   1703         : CFRefBug(checker, "-dealloc sent to non-exclusively owned object") {}
   1704 
   1705     const char *getDescription() const override {
   1706       return "-dealloc sent to object that may be referenced elsewhere";
   1707     }
   1708   };
   1709 
   1710   class OverAutorelease : public CFRefBug {
   1711   public:
   1712     OverAutorelease(const CheckerBase *checker)
   1713         : CFRefBug(checker, "Object autoreleased too many times") {}
   1714 
   1715     const char *getDescription() const override {
   1716       return "Object autoreleased too many times";
   1717     }
   1718   };
   1719 
   1720   class ReturnedNotOwnedForOwned : public CFRefBug {
   1721   public:
   1722     ReturnedNotOwnedForOwned(const CheckerBase *checker)
   1723         : CFRefBug(checker, "Method should return an owned object") {}
   1724 
   1725     const char *getDescription() const override {
   1726       return "Object with a +0 retain count returned to caller where a +1 "
   1727              "(owning) retain count is expected";
   1728     }
   1729   };
   1730 
   1731   class Leak : public CFRefBug {
   1732   public:
   1733     Leak(const CheckerBase *checker, StringRef name) : CFRefBug(checker, name) {
   1734       // Leaks should not be reported if they are post-dominated by a sink.
   1735       setSuppressOnSink(true);
   1736     }
   1737 
   1738     const char *getDescription() const override { return ""; }
   1739 
   1740     bool isLeak() const override { return true; }
   1741   };
   1742 
   1743   //===---------===//
   1744   // Bug Reports.  //
   1745   //===---------===//
   1746 
   1747   class CFRefReportVisitor : public BugReporterVisitorImpl<CFRefReportVisitor> {
   1748   protected:
   1749     SymbolRef Sym;
   1750     const SummaryLogTy &SummaryLog;
   1751     bool GCEnabled;
   1752 
   1753   public:
   1754     CFRefReportVisitor(SymbolRef sym, bool gcEnabled, const SummaryLogTy &log)
   1755        : Sym(sym), SummaryLog(log), GCEnabled(gcEnabled) {}
   1756 
   1757     void Profile(llvm::FoldingSetNodeID &ID) const override {
   1758       static int x = 0;
   1759       ID.AddPointer(&x);
   1760       ID.AddPointer(Sym);
   1761     }
   1762 
   1763     PathDiagnosticPiece *VisitNode(const ExplodedNode *N,
   1764                                    const ExplodedNode *PrevN,
   1765                                    BugReporterContext &BRC,
   1766                                    BugReport &BR) override;
   1767 
   1768     std::unique_ptr<PathDiagnosticPiece> getEndPath(BugReporterContext &BRC,
   1769                                                     const ExplodedNode *N,
   1770                                                     BugReport &BR) override;
   1771   };
   1772 
   1773   class CFRefLeakReportVisitor : public CFRefReportVisitor {
   1774   public:
   1775     CFRefLeakReportVisitor(SymbolRef sym, bool GCEnabled,
   1776                            const SummaryLogTy &log)
   1777        : CFRefReportVisitor(sym, GCEnabled, log) {}
   1778 
   1779     std::unique_ptr<PathDiagnosticPiece> getEndPath(BugReporterContext &BRC,
   1780                                                     const ExplodedNode *N,
   1781                                                     BugReport &BR) override;
   1782 
   1783     std::unique_ptr<BugReporterVisitor> clone() const override {
   1784       // The curiously-recurring template pattern only works for one level of
   1785       // subclassing. Rather than make a new template base for
   1786       // CFRefReportVisitor, we simply override clone() to do the right thing.
   1787       // This could be trouble someday if BugReporterVisitorImpl is ever
   1788       // used for something else besides a convenient implementation of clone().
   1789       return llvm::make_unique<CFRefLeakReportVisitor>(*this);
   1790     }
   1791   };
   1792 
   1793   class CFRefReport : public BugReport {
   1794     void addGCModeDescription(const LangOptions &LOpts, bool GCEnabled);
   1795 
   1796   public:
   1797     CFRefReport(CFRefBug &D, const LangOptions &LOpts, bool GCEnabled,
   1798                 const SummaryLogTy &Log, ExplodedNode *n, SymbolRef sym,
   1799                 bool registerVisitor = true)
   1800       : BugReport(D, D.getDescription(), n) {
   1801       if (registerVisitor)
   1802         addVisitor(llvm::make_unique<CFRefReportVisitor>(sym, GCEnabled, Log));
   1803       addGCModeDescription(LOpts, GCEnabled);
   1804     }
   1805 
   1806     CFRefReport(CFRefBug &D, const LangOptions &LOpts, bool GCEnabled,
   1807                 const SummaryLogTy &Log, ExplodedNode *n, SymbolRef sym,
   1808                 StringRef endText)
   1809       : BugReport(D, D.getDescription(), endText, n) {
   1810       addVisitor(llvm::make_unique<CFRefReportVisitor>(sym, GCEnabled, Log));
   1811       addGCModeDescription(LOpts, GCEnabled);
   1812     }
   1813 
   1814     llvm::iterator_range<ranges_iterator> getRanges() override {
   1815       const CFRefBug& BugTy = static_cast<CFRefBug&>(getBugType());
   1816       if (!BugTy.isLeak())
   1817         return BugReport::getRanges();
   1818       return llvm::make_range(ranges_iterator(), ranges_iterator());
   1819     }
   1820   };
   1821 
   1822   class CFRefLeakReport : public CFRefReport {
   1823     const MemRegion* AllocBinding;
   1824   public:
   1825     CFRefLeakReport(CFRefBug &D, const LangOptions &LOpts, bool GCEnabled,
   1826                     const SummaryLogTy &Log, ExplodedNode *n, SymbolRef sym,
   1827                     CheckerContext &Ctx,
   1828                     bool IncludeAllocationLine);
   1829 
   1830     PathDiagnosticLocation getLocation(const SourceManager &SM) const override {
   1831       assert(Location.isValid());
   1832       return Location;
   1833     }
   1834   };
   1835 } // end anonymous namespace
   1836 
   1837 void CFRefReport::addGCModeDescription(const LangOptions &LOpts,
   1838                                        bool GCEnabled) {
   1839   const char *GCModeDescription = nullptr;
   1840 
   1841   switch (LOpts.getGC()) {
   1842   case LangOptions::GCOnly:
   1843     assert(GCEnabled);
   1844     GCModeDescription = "Code is compiled to only use garbage collection";
   1845     break;
   1846 
   1847   case LangOptions::NonGC:
   1848     assert(!GCEnabled);
   1849     GCModeDescription = "Code is compiled to use reference counts";
   1850     break;
   1851 
   1852   case LangOptions::HybridGC:
   1853     if (GCEnabled) {
   1854       GCModeDescription = "Code is compiled to use either garbage collection "
   1855                           "(GC) or reference counts (non-GC).  The bug occurs "
   1856                           "with GC enabled";
   1857       break;
   1858     } else {
   1859       GCModeDescription = "Code is compiled to use either garbage collection "
   1860                           "(GC) or reference counts (non-GC).  The bug occurs "
   1861                           "in non-GC mode";
   1862       break;
   1863     }
   1864   }
   1865 
   1866   assert(GCModeDescription && "invalid/unknown GC mode");
   1867   addExtraText(GCModeDescription);
   1868 }
   1869 
   1870 static bool isNumericLiteralExpression(const Expr *E) {
   1871   // FIXME: This set of cases was copied from SemaExprObjC.
   1872   return isa<IntegerLiteral>(E) ||
   1873          isa<CharacterLiteral>(E) ||
   1874          isa<FloatingLiteral>(E) ||
   1875          isa<ObjCBoolLiteralExpr>(E) ||
   1876          isa<CXXBoolLiteralExpr>(E);
   1877 }
   1878 
   1879 /// Returns true if this stack frame is for an Objective-C method that is a
   1880 /// property getter or setter whose body has been synthesized by the analyzer.
   1881 static bool isSynthesizedAccessor(const StackFrameContext *SFC) {
   1882   auto Method = dyn_cast_or_null<ObjCMethodDecl>(SFC->getDecl());
   1883   if (!Method || !Method->isPropertyAccessor())
   1884     return false;
   1885 
   1886   return SFC->getAnalysisDeclContext()->isBodyAutosynthesized();
   1887 }
   1888 
   1889 PathDiagnosticPiece *CFRefReportVisitor::VisitNode(const ExplodedNode *N,
   1890                                                    const ExplodedNode *PrevN,
   1891                                                    BugReporterContext &BRC,
   1892                                                    BugReport &BR) {
   1893   // FIXME: We will eventually need to handle non-statement-based events
   1894   // (__attribute__((cleanup))).
   1895   if (!N->getLocation().getAs<StmtPoint>())
   1896     return nullptr;
   1897 
   1898   // Check if the type state has changed.
   1899   ProgramStateRef PrevSt = PrevN->getState();
   1900   ProgramStateRef CurrSt = N->getState();
   1901   const LocationContext *LCtx = N->getLocationContext();
   1902 
   1903   const RefVal* CurrT = getRefBinding(CurrSt, Sym);
   1904   if (!CurrT) return nullptr;
   1905 
   1906   const RefVal &CurrV = *CurrT;
   1907   const RefVal *PrevT = getRefBinding(PrevSt, Sym);
   1908 
   1909   // Create a string buffer to constain all the useful things we want
   1910   // to tell the user.
   1911   std::string sbuf;
   1912   llvm::raw_string_ostream os(sbuf);
   1913 
   1914   // This is the allocation site since the previous node had no bindings
   1915   // for this symbol.
   1916   if (!PrevT) {
   1917     const Stmt *S = N->getLocation().castAs<StmtPoint>().getStmt();
   1918 
   1919     if (isa<ObjCIvarRefExpr>(S) &&
   1920         isSynthesizedAccessor(LCtx->getCurrentStackFrame())) {
   1921       S = LCtx->getCurrentStackFrame()->getCallSite();
   1922     }
   1923 
   1924     if (isa<ObjCArrayLiteral>(S)) {
   1925       os << "NSArray literal is an object with a +0 retain count";
   1926     }
   1927     else if (isa<ObjCDictionaryLiteral>(S)) {
   1928       os << "NSDictionary literal is an object with a +0 retain count";
   1929     }
   1930     else if (const ObjCBoxedExpr *BL = dyn_cast<ObjCBoxedExpr>(S)) {
   1931       if (isNumericLiteralExpression(BL->getSubExpr()))
   1932         os << "NSNumber literal is an object with a +0 retain count";
   1933       else {
   1934         const ObjCInterfaceDecl *BoxClass = nullptr;
   1935         if (const ObjCMethodDecl *Method = BL->getBoxingMethod())
   1936           BoxClass = Method->getClassInterface();
   1937 
   1938         // We should always be able to find the boxing class interface,
   1939         // but consider this future-proofing.
   1940         if (BoxClass)
   1941           os << *BoxClass << " b";
   1942         else
   1943           os << "B";
   1944 
   1945         os << "oxed expression produces an object with a +0 retain count";
   1946       }
   1947     }
   1948     else if (isa<ObjCIvarRefExpr>(S)) {
   1949       os << "Object loaded from instance variable";
   1950     }
   1951     else {
   1952       if (const CallExpr *CE = dyn_cast<CallExpr>(S)) {
   1953         // Get the name of the callee (if it is available).
   1954         SVal X = CurrSt->getSValAsScalarOrLoc(CE->getCallee(), LCtx);
   1955         if (const FunctionDecl *FD = X.getAsFunctionDecl())
   1956           os << "Call to function '" << *FD << '\'';
   1957         else
   1958           os << "function call";
   1959       }
   1960       else {
   1961         assert(isa<ObjCMessageExpr>(S));
   1962         CallEventManager &Mgr = CurrSt->getStateManager().getCallEventManager();
   1963         CallEventRef<ObjCMethodCall> Call
   1964           = Mgr.getObjCMethodCall(cast<ObjCMessageExpr>(S), CurrSt, LCtx);
   1965 
   1966         switch (Call->getMessageKind()) {
   1967         case OCM_Message:
   1968           os << "Method";
   1969           break;
   1970         case OCM_PropertyAccess:
   1971           os << "Property";
   1972           break;
   1973         case OCM_Subscript:
   1974           os << "Subscript";
   1975           break;
   1976         }
   1977       }
   1978 
   1979       if (CurrV.getObjKind() == RetEffect::CF) {
   1980         os << " returns a Core Foundation object with a ";
   1981       }
   1982       else {
   1983         assert (CurrV.getObjKind() == RetEffect::ObjC);
   1984         os << " returns an Objective-C object with a ";
   1985       }
   1986 
   1987       if (CurrV.isOwned()) {
   1988         os << "+1 retain count";
   1989 
   1990         if (GCEnabled) {
   1991           assert(CurrV.getObjKind() == RetEffect::CF);
   1992           os << ".  "
   1993           "Core Foundation objects are not automatically garbage collected.";
   1994         }
   1995       }
   1996       else {
   1997         assert (CurrV.isNotOwned());
   1998         os << "+0 retain count";
   1999       }
   2000     }
   2001 
   2002     PathDiagnosticLocation Pos(S, BRC.getSourceManager(),
   2003                                   N->getLocationContext());
   2004     return new PathDiagnosticEventPiece(Pos, os.str());
   2005   }
   2006 
   2007   // Gather up the effects that were performed on the object at this
   2008   // program point
   2009   SmallVector<ArgEffect, 2> AEffects;
   2010 
   2011   const ExplodedNode *OrigNode = BRC.getNodeResolver().getOriginalNode(N);
   2012   if (const RetainSummary *Summ = SummaryLog.lookup(OrigNode)) {
   2013     // We only have summaries attached to nodes after evaluating CallExpr and
   2014     // ObjCMessageExprs.
   2015     const Stmt *S = N->getLocation().castAs<StmtPoint>().getStmt();
   2016 
   2017     if (const CallExpr *CE = dyn_cast<CallExpr>(S)) {
   2018       // Iterate through the parameter expressions and see if the symbol
   2019       // was ever passed as an argument.
   2020       unsigned i = 0;
   2021 
   2022       for (CallExpr::const_arg_iterator AI=CE->arg_begin(), AE=CE->arg_end();
   2023            AI!=AE; ++AI, ++i) {
   2024 
   2025         // Retrieve the value of the argument.  Is it the symbol
   2026         // we are interested in?
   2027         if (CurrSt->getSValAsScalarOrLoc(*AI, LCtx).getAsLocSymbol() != Sym)
   2028           continue;
   2029 
   2030         // We have an argument.  Get the effect!
   2031         AEffects.push_back(Summ->getArg(i));
   2032       }
   2033     }
   2034     else if (const ObjCMessageExpr *ME = dyn_cast<ObjCMessageExpr>(S)) {
   2035       if (const Expr *receiver = ME->getInstanceReceiver())
   2036         if (CurrSt->getSValAsScalarOrLoc(receiver, LCtx)
   2037               .getAsLocSymbol() == Sym) {
   2038           // The symbol we are tracking is the receiver.
   2039           AEffects.push_back(Summ->getReceiverEffect());
   2040         }
   2041     }
   2042   }
   2043 
   2044   do {
   2045     // Get the previous type state.
   2046     RefVal PrevV = *PrevT;
   2047 
   2048     // Specially handle -dealloc.
   2049     if (!GCEnabled && std::find(AEffects.begin(), AEffects.end(), Dealloc) !=
   2050                           AEffects.end()) {
   2051       // Determine if the object's reference count was pushed to zero.
   2052       assert(!PrevV.hasSameState(CurrV) && "The state should have changed.");
   2053       // We may not have transitioned to 'release' if we hit an error.
   2054       // This case is handled elsewhere.
   2055       if (CurrV.getKind() == RefVal::Released) {
   2056         assert(CurrV.getCombinedCounts() == 0);
   2057         os << "Object released by directly sending the '-dealloc' message";
   2058         break;
   2059       }
   2060     }
   2061 
   2062     // Specially handle CFMakeCollectable and friends.
   2063     if (std::find(AEffects.begin(), AEffects.end(), MakeCollectable) !=
   2064         AEffects.end()) {
   2065       // Get the name of the function.
   2066       const Stmt *S = N->getLocation().castAs<StmtPoint>().getStmt();
   2067       SVal X =
   2068         CurrSt->getSValAsScalarOrLoc(cast<CallExpr>(S)->getCallee(), LCtx);
   2069       const FunctionDecl *FD = X.getAsFunctionDecl();
   2070 
   2071       if (GCEnabled) {
   2072         // Determine if the object's reference count was pushed to zero.
   2073         assert(!PrevV.hasSameState(CurrV) && "The state should have changed.");
   2074 
   2075         os << "In GC mode a call to '" << *FD
   2076         <<  "' decrements an object's retain count and registers the "
   2077         "object with the garbage collector. ";
   2078 
   2079         if (CurrV.getKind() == RefVal::Released) {
   2080           assert(CurrV.getCount() == 0);
   2081           os << "Since it now has a 0 retain count the object can be "
   2082           "automatically collected by the garbage collector.";
   2083         }
   2084         else
   2085           os << "An object must have a 0 retain count to be garbage collected. "
   2086           "After this call its retain count is +" << CurrV.getCount()
   2087           << '.';
   2088       }
   2089       else
   2090         os << "When GC is not enabled a call to '" << *FD
   2091         << "' has no effect on its argument.";
   2092 
   2093       // Nothing more to say.
   2094       break;
   2095     }
   2096 
   2097     // Determine if the typestate has changed.
   2098     if (!PrevV.hasSameState(CurrV))
   2099       switch (CurrV.getKind()) {
   2100         case RefVal::Owned:
   2101         case RefVal::NotOwned:
   2102           if (PrevV.getCount() == CurrV.getCount()) {
   2103             // Did an autorelease message get sent?
   2104             if (PrevV.getAutoreleaseCount() == CurrV.getAutoreleaseCount())
   2105               return nullptr;
   2106 
   2107             assert(PrevV.getAutoreleaseCount() < CurrV.getAutoreleaseCount());
   2108             os << "Object autoreleased";
   2109             break;
   2110           }
   2111 
   2112           if (PrevV.getCount() > CurrV.getCount())
   2113             os << "Reference count decremented.";
   2114           else
   2115             os << "Reference count incremented.";
   2116 
   2117           if (unsigned Count = CurrV.getCount())
   2118             os << " The object now has a +" << Count << " retain count.";
   2119 
   2120           if (PrevV.getKind() == RefVal::Released) {
   2121             assert(GCEnabled && CurrV.getCount() > 0);
   2122             os << " The object is not eligible for garbage collection until "
   2123                   "the retain count reaches 0 again.";
   2124           }
   2125 
   2126           break;
   2127 
   2128         case RefVal::Released:
   2129           if (CurrV.getIvarAccessHistory() ==
   2130                 RefVal::IvarAccessHistory::ReleasedAfterDirectAccess &&
   2131               CurrV.getIvarAccessHistory() != PrevV.getIvarAccessHistory()) {
   2132             os << "Strong instance variable relinquished. ";
   2133           }
   2134           os << "Object released.";
   2135           break;
   2136 
   2137         case RefVal::ReturnedOwned:
   2138           // Autoreleases can be applied after marking a node ReturnedOwned.
   2139           if (CurrV.getAutoreleaseCount())
   2140             return nullptr;
   2141 
   2142           os << "Object returned to caller as an owning reference (single "
   2143                 "retain count transferred to caller)";
   2144           break;
   2145 
   2146         case RefVal::ReturnedNotOwned:
   2147           os << "Object returned to caller with a +0 retain count";
   2148           break;
   2149 
   2150         default:
   2151           return nullptr;
   2152       }
   2153 
   2154     // Emit any remaining diagnostics for the argument effects (if any).
   2155     for (SmallVectorImpl<ArgEffect>::iterator I=AEffects.begin(),
   2156          E=AEffects.end(); I != E; ++I) {
   2157 
   2158       // A bunch of things have alternate behavior under GC.
   2159       if (GCEnabled)
   2160         switch (*I) {
   2161           default: break;
   2162           case Autorelease:
   2163             os << "In GC mode an 'autorelease' has no effect.";
   2164             continue;
   2165           case IncRefMsg:
   2166             os << "In GC mode the 'retain' message has no effect.";
   2167             continue;
   2168           case DecRefMsg:
   2169             os << "In GC mode the 'release' message has no effect.";
   2170             continue;
   2171         }
   2172     }
   2173   } while (0);
   2174 
   2175   if (os.str().empty())
   2176     return nullptr; // We have nothing to say!
   2177 
   2178   const Stmt *S = N->getLocation().castAs<StmtPoint>().getStmt();
   2179   PathDiagnosticLocation Pos(S, BRC.getSourceManager(),
   2180                                 N->getLocationContext());
   2181   PathDiagnosticPiece *P = new PathDiagnosticEventPiece(Pos, os.str());
   2182 
   2183   // Add the range by scanning the children of the statement for any bindings
   2184   // to Sym.
   2185   for (const Stmt *Child : S->children())
   2186     if (const Expr *Exp = dyn_cast_or_null<Expr>(Child))
   2187       if (CurrSt->getSValAsScalarOrLoc(Exp, LCtx).getAsLocSymbol() == Sym) {
   2188         P->addRange(Exp->getSourceRange());
   2189         break;
   2190       }
   2191 
   2192   return P;
   2193 }
   2194 
   2195 namespace {
   2196 // Find the first node in the current function context that referred to the
   2197 // tracked symbol and the memory location that value was stored to. Note, the
   2198 // value is only reported if the allocation occurred in the same function as
   2199 // the leak. The function can also return a location context, which should be
   2200 // treated as interesting.
   2201 struct AllocationInfo {
   2202   const ExplodedNode* N;
   2203   const MemRegion *R;
   2204   const LocationContext *InterestingMethodContext;
   2205   AllocationInfo(const ExplodedNode *InN,
   2206                  const MemRegion *InR,
   2207                  const LocationContext *InInterestingMethodContext) :
   2208     N(InN), R(InR), InterestingMethodContext(InInterestingMethodContext) {}
   2209 };
   2210 } // end anonymous namespace
   2211 
   2212 static AllocationInfo
   2213 GetAllocationSite(ProgramStateManager& StateMgr, const ExplodedNode *N,
   2214                   SymbolRef Sym) {
   2215   const ExplodedNode *AllocationNode = N;
   2216   const ExplodedNode *AllocationNodeInCurrentOrParentContext = N;
   2217   const MemRegion *FirstBinding = nullptr;
   2218   const LocationContext *LeakContext = N->getLocationContext();
   2219 
   2220   // The location context of the init method called on the leaked object, if
   2221   // available.
   2222   const LocationContext *InitMethodContext = nullptr;
   2223 
   2224   while (N) {
   2225     ProgramStateRef St = N->getState();
   2226     const LocationContext *NContext = N->getLocationContext();
   2227 
   2228     if (!getRefBinding(St, Sym))
   2229       break;
   2230 
   2231     StoreManager::FindUniqueBinding FB(Sym);
   2232     StateMgr.iterBindings(St, FB);
   2233 
   2234     if (FB) {
   2235       const MemRegion *R = FB.getRegion();
   2236       const VarRegion *VR = R->getBaseRegion()->getAs<VarRegion>();
   2237       // Do not show local variables belonging to a function other than
   2238       // where the error is reported.
   2239       if (!VR || VR->getStackFrame() == LeakContext->getCurrentStackFrame())
   2240         FirstBinding = R;
   2241     }
   2242 
   2243     // AllocationNode is the last node in which the symbol was tracked.
   2244     AllocationNode = N;
   2245 
   2246     // AllocationNodeInCurrentContext, is the last node in the current or
   2247     // parent context in which the symbol was tracked.
   2248     //
   2249     // Note that the allocation site might be in the parent conext. For example,
   2250     // the case where an allocation happens in a block that captures a reference
   2251     // to it and that reference is overwritten/dropped by another call to
   2252     // the block.
   2253     if (NContext == LeakContext || NContext->isParentOf(LeakContext))
   2254       AllocationNodeInCurrentOrParentContext = N;
   2255 
   2256     // Find the last init that was called on the given symbol and store the
   2257     // init method's location context.
   2258     if (!InitMethodContext)
   2259       if (Optional<CallEnter> CEP = N->getLocation().getAs<CallEnter>()) {
   2260         const Stmt *CE = CEP->getCallExpr();
   2261         if (const ObjCMessageExpr *ME = dyn_cast_or_null<ObjCMessageExpr>(CE)) {
   2262           const Stmt *RecExpr = ME->getInstanceReceiver();
   2263           if (RecExpr) {
   2264             SVal RecV = St->getSVal(RecExpr, NContext);
   2265             if (ME->getMethodFamily() == OMF_init && RecV.getAsSymbol() == Sym)
   2266               InitMethodContext = CEP->getCalleeContext();
   2267           }
   2268         }
   2269       }
   2270 
   2271     N = N->pred_empty() ? nullptr : *(N->pred_begin());
   2272   }
   2273 
   2274   // If we are reporting a leak of the object that was allocated with alloc,
   2275   // mark its init method as interesting.
   2276   const LocationContext *InterestingMethodContext = nullptr;
   2277   if (InitMethodContext) {
   2278     const ProgramPoint AllocPP = AllocationNode->getLocation();
   2279     if (Optional<StmtPoint> SP = AllocPP.getAs<StmtPoint>())
   2280       if (const ObjCMessageExpr *ME = SP->getStmtAs<ObjCMessageExpr>())
   2281         if (ME->getMethodFamily() == OMF_alloc)
   2282           InterestingMethodContext = InitMethodContext;
   2283   }
   2284 
   2285   // If allocation happened in a function different from the leak node context,
   2286   // do not report the binding.
   2287   assert(N && "Could not find allocation node");
   2288   if (N->getLocationContext() != LeakContext) {
   2289     FirstBinding = nullptr;
   2290   }
   2291 
   2292   return AllocationInfo(AllocationNodeInCurrentOrParentContext,
   2293                         FirstBinding,
   2294                         InterestingMethodContext);
   2295 }
   2296 
   2297 std::unique_ptr<PathDiagnosticPiece>
   2298 CFRefReportVisitor::getEndPath(BugReporterContext &BRC,
   2299                                const ExplodedNode *EndN, BugReport &BR) {
   2300   BR.markInteresting(Sym);
   2301   return BugReporterVisitor::getDefaultEndPath(BRC, EndN, BR);
   2302 }
   2303 
   2304 std::unique_ptr<PathDiagnosticPiece>
   2305 CFRefLeakReportVisitor::getEndPath(BugReporterContext &BRC,
   2306                                    const ExplodedNode *EndN, BugReport &BR) {
   2307 
   2308   // Tell the BugReporterContext to report cases when the tracked symbol is
   2309   // assigned to different variables, etc.
   2310   BR.markInteresting(Sym);
   2311 
   2312   // We are reporting a leak.  Walk up the graph to get to the first node where
   2313   // the symbol appeared, and also get the first VarDecl that tracked object
   2314   // is stored to.
   2315   AllocationInfo AllocI =
   2316     GetAllocationSite(BRC.getStateManager(), EndN, Sym);
   2317 
   2318   const MemRegion* FirstBinding = AllocI.R;
   2319   BR.markInteresting(AllocI.InterestingMethodContext);
   2320 
   2321   SourceManager& SM = BRC.getSourceManager();
   2322 
   2323   // Compute an actual location for the leak.  Sometimes a leak doesn't
   2324   // occur at an actual statement (e.g., transition between blocks; end
   2325   // of function) so we need to walk the graph and compute a real location.
   2326   const ExplodedNode *LeakN = EndN;
   2327   PathDiagnosticLocation L = PathDiagnosticLocation::createEndOfPath(LeakN, SM);
   2328 
   2329   std::string sbuf;
   2330   llvm::raw_string_ostream os(sbuf);
   2331 
   2332   os << "Object leaked: ";
   2333 
   2334   if (FirstBinding) {
   2335     os << "object allocated and stored into '"
   2336        << FirstBinding->getString() << '\'';
   2337   }
   2338   else
   2339     os << "allocated object";
   2340 
   2341   // Get the retain count.
   2342   const RefVal* RV = getRefBinding(EndN->getState(), Sym);
   2343   assert(RV);
   2344 
   2345   if (RV->getKind() == RefVal::ErrorLeakReturned) {
   2346     // FIXME: Per comments in rdar://6320065, "create" only applies to CF
   2347     // objects.  Only "copy", "alloc", "retain" and "new" transfer ownership
   2348     // to the caller for NS objects.
   2349     const Decl *D = &EndN->getCodeDecl();
   2350 
   2351     os << (isa<ObjCMethodDecl>(D) ? " is returned from a method "
   2352                                   : " is returned from a function ");
   2353 
   2354     if (D->hasAttr<CFReturnsNotRetainedAttr>())
   2355       os << "that is annotated as CF_RETURNS_NOT_RETAINED";
   2356     else if (D->hasAttr<NSReturnsNotRetainedAttr>())
   2357       os << "that is annotated as NS_RETURNS_NOT_RETAINED";
   2358     else {
   2359       if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) {
   2360         os << "whose name ('" << MD->getSelector().getAsString()
   2361            << "') does not start with 'copy', 'mutableCopy', 'alloc' or 'new'."
   2362               "  This violates the naming convention rules"
   2363               " given in the Memory Management Guide for Cocoa";
   2364       }
   2365       else {
   2366         const FunctionDecl *FD = cast<FunctionDecl>(D);
   2367         os << "whose name ('" << *FD
   2368            << "') does not contain 'Copy' or 'Create'.  This violates the naming"
   2369               " convention rules given in the Memory Management Guide for Core"
   2370               " Foundation";
   2371       }
   2372     }
   2373   }
   2374   else if (RV->getKind() == RefVal::ErrorGCLeakReturned) {
   2375     const ObjCMethodDecl &MD = cast<ObjCMethodDecl>(EndN->getCodeDecl());
   2376     os << " and returned from method '" << MD.getSelector().getAsString()
   2377        << "' is potentially leaked when using garbage collection.  Callers "
   2378           "of this method do not expect a returned object with a +1 retain "
   2379           "count since they expect the object to be managed by the garbage "
   2380           "collector";
   2381   }
   2382   else
   2383     os << " is not referenced later in this execution path and has a retain "
   2384           "count of +" << RV->getCount();
   2385 
   2386   return llvm::make_unique<PathDiagnosticEventPiece>(L, os.str());
   2387 }
   2388 
   2389 CFRefLeakReport::CFRefLeakReport(CFRefBug &D, const LangOptions &LOpts,
   2390                                  bool GCEnabled, const SummaryLogTy &Log,
   2391                                  ExplodedNode *n, SymbolRef sym,
   2392                                  CheckerContext &Ctx,
   2393                                  bool IncludeAllocationLine)
   2394   : CFRefReport(D, LOpts, GCEnabled, Log, n, sym, false) {
   2395 
   2396   // Most bug reports are cached at the location where they occurred.
   2397   // With leaks, we want to unique them by the location where they were
   2398   // allocated, and only report a single path.  To do this, we need to find
   2399   // the allocation site of a piece of tracked memory, which we do via a
   2400   // call to GetAllocationSite.  This will walk the ExplodedGraph backwards.
   2401   // Note that this is *not* the trimmed graph; we are guaranteed, however,
   2402   // that all ancestor nodes that represent the allocation site have the
   2403   // same SourceLocation.
   2404   const ExplodedNode *AllocNode = nullptr;
   2405 
   2406   const SourceManager& SMgr = Ctx.getSourceManager();
   2407 
   2408   AllocationInfo AllocI =
   2409     GetAllocationSite(Ctx.getStateManager(), getErrorNode(), sym);
   2410 
   2411   AllocNode = AllocI.N;
   2412   AllocBinding = AllocI.R;
   2413   markInteresting(AllocI.InterestingMethodContext);
   2414 
   2415   // Get the SourceLocation for the allocation site.
   2416   // FIXME: This will crash the analyzer if an allocation comes from an
   2417   // implicit call (ex: a destructor call).
   2418   // (Currently there are no such allocations in Cocoa, though.)
   2419   const Stmt *AllocStmt = nullptr;
   2420   ProgramPoint P = AllocNode->getLocation();
   2421   if (Optional<CallExitEnd> Exit = P.getAs<CallExitEnd>())
   2422     AllocStmt = Exit->getCalleeContext()->getCallSite();
   2423   else
   2424     AllocStmt = P.castAs<PostStmt>().getStmt();
   2425   assert(AllocStmt && "Cannot find allocation statement");
   2426 
   2427   PathDiagnosticLocation AllocLocation =
   2428     PathDiagnosticLocation::createBegin(AllocStmt, SMgr,
   2429                                         AllocNode->getLocationContext());
   2430   Location = AllocLocation;
   2431 
   2432   // Set uniqieing info, which will be used for unique the bug reports. The
   2433   // leaks should be uniqued on the allocation site.
   2434   UniqueingLocation = AllocLocation;
   2435   UniqueingDecl = AllocNode->getLocationContext()->getDecl();
   2436 
   2437   // Fill in the description of the bug.
   2438   Description.clear();
   2439   llvm::raw_string_ostream os(Description);
   2440   os << "Potential leak ";
   2441   if (GCEnabled)
   2442     os << "(when using garbage collection) ";
   2443   os << "of an object";
   2444 
   2445   if (AllocBinding) {
   2446     os << " stored into '" << AllocBinding->getString() << '\'';
   2447     if (IncludeAllocationLine) {
   2448       FullSourceLoc SL(AllocStmt->getLocStart(), Ctx.getSourceManager());
   2449       os << " (allocated on line " << SL.getSpellingLineNumber() << ")";
   2450     }
   2451   }
   2452 
   2453   addVisitor(llvm::make_unique<CFRefLeakReportVisitor>(sym, GCEnabled, Log));
   2454 }
   2455 
   2456 //===----------------------------------------------------------------------===//
   2457 // Main checker logic.
   2458 //===----------------------------------------------------------------------===//
   2459 
   2460 namespace {
   2461 class RetainCountChecker
   2462   : public Checker< check::Bind,
   2463                     check::DeadSymbols,
   2464                     check::EndAnalysis,
   2465                     check::EndFunction,
   2466                     check::PostStmt<BlockExpr>,
   2467                     check::PostStmt<CastExpr>,
   2468                     check::PostStmt<ObjCArrayLiteral>,
   2469                     check::PostStmt<ObjCDictionaryLiteral>,
   2470                     check::PostStmt<ObjCBoxedExpr>,
   2471                     check::PostStmt<ObjCIvarRefExpr>,
   2472                     check::PostCall,
   2473                     check::PreStmt<ReturnStmt>,
   2474                     check::RegionChanges,
   2475                     eval::Assume,
   2476                     eval::Call > {
   2477   mutable std::unique_ptr<CFRefBug> useAfterRelease, releaseNotOwned;
   2478   mutable std::unique_ptr<CFRefBug> deallocGC, deallocNotOwned;
   2479   mutable std::unique_ptr<CFRefBug> overAutorelease, returnNotOwnedForOwned;
   2480   mutable std::unique_ptr<CFRefBug> leakWithinFunction, leakAtReturn;
   2481   mutable std::unique_ptr<CFRefBug> leakWithinFunctionGC, leakAtReturnGC;
   2482 
   2483   typedef llvm::DenseMap<SymbolRef, const CheckerProgramPointTag *> SymbolTagMap;
   2484 
   2485   // This map is only used to ensure proper deletion of any allocated tags.
   2486   mutable SymbolTagMap DeadSymbolTags;
   2487 
   2488   mutable std::unique_ptr<RetainSummaryManager> Summaries;
   2489   mutable std::unique_ptr<RetainSummaryManager> SummariesGC;
   2490   mutable SummaryLogTy SummaryLog;
   2491   mutable bool ShouldResetSummaryLog;
   2492 
   2493   /// Optional setting to indicate if leak reports should include
   2494   /// the allocation line.
   2495   mutable bool IncludeAllocationLine;
   2496 
   2497 public:
   2498   RetainCountChecker(AnalyzerOptions &AO)
   2499     : ShouldResetSummaryLog(false),
   2500       IncludeAllocationLine(shouldIncludeAllocationSiteInLeakDiagnostics(AO)) {}
   2501 
   2502   ~RetainCountChecker() override { DeleteContainerSeconds(DeadSymbolTags); }
   2503 
   2504   void checkEndAnalysis(ExplodedGraph &G, BugReporter &BR,
   2505                         ExprEngine &Eng) const {
   2506     // FIXME: This is a hack to make sure the summary log gets cleared between
   2507     // analyses of different code bodies.
   2508     //
   2509     // Why is this necessary? Because a checker's lifetime is tied to a
   2510     // translation unit, but an ExplodedGraph's lifetime is just a code body.
   2511     // Once in a blue moon, a new ExplodedNode will have the same address as an
   2512     // old one with an associated summary, and the bug report visitor gets very
   2513     // confused. (To make things worse, the summary lifetime is currently also
   2514     // tied to a code body, so we get a crash instead of incorrect results.)
   2515     //
   2516     // Why is this a bad solution? Because if the lifetime of the ExplodedGraph
   2517     // changes, things will start going wrong again. Really the lifetime of this
   2518     // log needs to be tied to either the specific nodes in it or the entire
   2519     // ExplodedGraph, not to a specific part of the code being analyzed.
   2520     //
   2521     // (Also, having stateful local data means that the same checker can't be
   2522     // used from multiple threads, but a lot of checkers have incorrect
   2523     // assumptions about that anyway. So that wasn't a priority at the time of
   2524     // this fix.)
   2525     //
   2526     // This happens at the end of analysis, but bug reports are emitted /after/
   2527     // this point. So we can't just clear the summary log now. Instead, we mark
   2528     // that the next time we access the summary log, it should be cleared.
   2529 
   2530     // If we never reset the summary log during /this/ code body analysis,
   2531     // there were no new summaries. There might still have been summaries from
   2532     // the /last/ analysis, so clear them out to make sure the bug report
   2533     // visitors don't get confused.
   2534     if (ShouldResetSummaryLog)
   2535       SummaryLog.clear();
   2536 
   2537     ShouldResetSummaryLog = !SummaryLog.empty();
   2538   }
   2539 
   2540   CFRefBug *getLeakWithinFunctionBug(const LangOptions &LOpts,
   2541                                      bool GCEnabled) const {
   2542     if (GCEnabled) {
   2543       if (!leakWithinFunctionGC)
   2544         leakWithinFunctionGC.reset(new Leak(this, "Leak of object when using "
   2545                                                   "garbage collection"));
   2546       return leakWithinFunctionGC.get();
   2547     } else {
   2548       if (!leakWithinFunction) {
   2549         if (LOpts.getGC() == LangOptions::HybridGC) {
   2550           leakWithinFunction.reset(new Leak(this,
   2551                                             "Leak of object when not using "
   2552                                             "garbage collection (GC) in "
   2553                                             "dual GC/non-GC code"));
   2554         } else {
   2555           leakWithinFunction.reset(new Leak(this, "Leak"));
   2556         }
   2557       }
   2558       return leakWithinFunction.get();
   2559     }
   2560   }
   2561 
   2562   CFRefBug *getLeakAtReturnBug(const LangOptions &LOpts, bool GCEnabled) const {
   2563     if (GCEnabled) {
   2564       if (!leakAtReturnGC)
   2565         leakAtReturnGC.reset(new Leak(this,
   2566                                       "Leak of returned object when using "
   2567                                       "garbage collection"));
   2568       return leakAtReturnGC.get();
   2569     } else {
   2570       if (!leakAtReturn) {
   2571         if (LOpts.getGC() == LangOptions::HybridGC) {
   2572           leakAtReturn.reset(new Leak(this,
   2573                                       "Leak of returned object when not using "
   2574                                       "garbage collection (GC) in dual "
   2575                                       "GC/non-GC code"));
   2576         } else {
   2577           leakAtReturn.reset(new Leak(this, "Leak of returned object"));
   2578         }
   2579       }
   2580       return leakAtReturn.get();
   2581     }
   2582   }
   2583 
   2584   RetainSummaryManager &getSummaryManager(ASTContext &Ctx,
   2585                                           bool GCEnabled) const {
   2586     // FIXME: We don't support ARC being turned on and off during one analysis.
   2587     // (nor, for that matter, do we support changing ASTContexts)
   2588     bool ARCEnabled = (bool)Ctx.getLangOpts().ObjCAutoRefCount;
   2589     if (GCEnabled) {
   2590       if (!SummariesGC)
   2591         SummariesGC.reset(new RetainSummaryManager(Ctx, true, ARCEnabled));
   2592       else
   2593         assert(SummariesGC->isARCEnabled() == ARCEnabled);
   2594       return *SummariesGC;
   2595     } else {
   2596       if (!Summaries)
   2597         Summaries.reset(new RetainSummaryManager(Ctx, false, ARCEnabled));
   2598       else
   2599         assert(Summaries->isARCEnabled() == ARCEnabled);
   2600       return *Summaries;
   2601     }
   2602   }
   2603 
   2604   RetainSummaryManager &getSummaryManager(CheckerContext &C) const {
   2605     return getSummaryManager(C.getASTContext(), C.isObjCGCEnabled());
   2606   }
   2607 
   2608   void printState(raw_ostream &Out, ProgramStateRef State,
   2609                   const char *NL, const char *Sep) const override;
   2610 
   2611   void checkBind(SVal loc, SVal val, const Stmt *S, CheckerContext &C) const;
   2612   void checkPostStmt(const BlockExpr *BE, CheckerContext &C) const;
   2613   void checkPostStmt(const CastExpr *CE, CheckerContext &C) const;
   2614 
   2615   void checkPostStmt(const ObjCArrayLiteral *AL, CheckerContext &C) const;
   2616   void checkPostStmt(const ObjCDictionaryLiteral *DL, CheckerContext &C) const;
   2617   void checkPostStmt(const ObjCBoxedExpr *BE, CheckerContext &C) const;
   2618 
   2619   void checkPostStmt(const ObjCIvarRefExpr *IRE, CheckerContext &C) const;
   2620 
   2621   void checkPostCall(const CallEvent &Call, CheckerContext &C) const;
   2622 
   2623   void checkSummary(const RetainSummary &Summ, const CallEvent &Call,
   2624                     CheckerContext &C) const;
   2625 
   2626   void processSummaryOfInlined(const RetainSummary &Summ,
   2627                                const CallEvent &Call,
   2628                                CheckerContext &C) const;
   2629 
   2630   bool evalCall(const CallExpr *CE, CheckerContext &C) const;
   2631 
   2632   ProgramStateRef evalAssume(ProgramStateRef state, SVal Cond,
   2633                                  bool Assumption) const;
   2634 
   2635   ProgramStateRef
   2636   checkRegionChanges(ProgramStateRef state,
   2637                      const InvalidatedSymbols *invalidated,
   2638                      ArrayRef<const MemRegion *> ExplicitRegions,
   2639                      ArrayRef<const MemRegion *> Regions,
   2640                      const CallEvent *Call) const;
   2641 
   2642   bool wantsRegionChangeUpdate(ProgramStateRef state) const {
   2643     return true;
   2644   }
   2645 
   2646   void checkPreStmt(const ReturnStmt *S, CheckerContext &C) const;
   2647   void checkReturnWithRetEffect(const ReturnStmt *S, CheckerContext &C,
   2648                                 ExplodedNode *Pred, RetEffect RE, RefVal X,
   2649                                 SymbolRef Sym, ProgramStateRef state) const;
   2650 
   2651   void checkDeadSymbols(SymbolReaper &SymReaper, CheckerContext &C) const;
   2652   void checkEndFunction(CheckerContext &C) const;
   2653 
   2654   ProgramStateRef updateSymbol(ProgramStateRef state, SymbolRef sym,
   2655                                RefVal V, ArgEffect E, RefVal::Kind &hasErr,
   2656                                CheckerContext &C) const;
   2657 
   2658   void processNonLeakError(ProgramStateRef St, SourceRange ErrorRange,
   2659                            RefVal::Kind ErrorKind, SymbolRef Sym,
   2660                            CheckerContext &C) const;
   2661 
   2662   void processObjCLiterals(CheckerContext &C, const Expr *Ex) const;
   2663 
   2664   const ProgramPointTag *getDeadSymbolTag(SymbolRef sym) const;
   2665 
   2666   ProgramStateRef handleSymbolDeath(ProgramStateRef state,
   2667                                     SymbolRef sid, RefVal V,
   2668                                     SmallVectorImpl<SymbolRef> &Leaked) const;
   2669 
   2670   ProgramStateRef
   2671   handleAutoreleaseCounts(ProgramStateRef state, ExplodedNode *Pred,
   2672                           const ProgramPointTag *Tag, CheckerContext &Ctx,
   2673                           SymbolRef Sym, RefVal V) const;
   2674 
   2675   ExplodedNode *processLeaks(ProgramStateRef state,
   2676                              SmallVectorImpl<SymbolRef> &Leaked,
   2677                              CheckerContext &Ctx,
   2678                              ExplodedNode *Pred = nullptr) const;
   2679 };
   2680 } // end anonymous namespace
   2681 
   2682 namespace {
   2683 class StopTrackingCallback final : public SymbolVisitor {
   2684   ProgramStateRef state;
   2685 public:
   2686   StopTrackingCallback(ProgramStateRef st) : state(st) {}
   2687   ProgramStateRef getState() const { return state; }
   2688 
   2689   bool VisitSymbol(SymbolRef sym) override {
   2690     state = state->remove<RefBindings>(sym);
   2691     return true;
   2692   }
   2693 };
   2694 } // end anonymous namespace
   2695 
   2696 //===----------------------------------------------------------------------===//
   2697 // Handle statements that may have an effect on refcounts.
   2698 //===----------------------------------------------------------------------===//
   2699 
   2700 void RetainCountChecker::checkPostStmt(const BlockExpr *BE,
   2701                                        CheckerContext &C) const {
   2702 
   2703   // Scan the BlockDecRefExprs for any object the retain count checker
   2704   // may be tracking.
   2705   if (!BE->getBlockDecl()->hasCaptures())
   2706     return;
   2707 
   2708   ProgramStateRef state = C.getState();
   2709   const BlockDataRegion *R =
   2710     cast<BlockDataRegion>(state->getSVal(BE,
   2711                                          C.getLocationContext()).getAsRegion());
   2712 
   2713   BlockDataRegion::referenced_vars_iterator I = R->referenced_vars_begin(),
   2714                                             E = R->referenced_vars_end();
   2715 
   2716   if (I == E)
   2717     return;
   2718 
   2719   // FIXME: For now we invalidate the tracking of all symbols passed to blocks
   2720   // via captured variables, even though captured variables result in a copy
   2721   // and in implicit increment/decrement of a retain count.
   2722   SmallVector<const MemRegion*, 10> Regions;
   2723   const LocationContext *LC = C.getLocationContext();
   2724   MemRegionManager &MemMgr = C.getSValBuilder().getRegionManager();
   2725 
   2726   for ( ; I != E; ++I) {
   2727     const VarRegion *VR = I.getCapturedRegion();
   2728     if (VR->getSuperRegion() == R) {
   2729       VR = MemMgr.getVarRegion(VR->getDecl(), LC);
   2730     }
   2731     Regions.push_back(VR);
   2732   }
   2733 
   2734   state =
   2735     state->scanReachableSymbols<StopTrackingCallback>(Regions.data(),
   2736                                     Regions.data() + Regions.size()).getState();
   2737   C.addTransition(state);
   2738 }
   2739 
   2740 void RetainCountChecker::checkPostStmt(const CastExpr *CE,
   2741                                        CheckerContext &C) const {
   2742   const ObjCBridgedCastExpr *BE = dyn_cast<ObjCBridgedCastExpr>(CE);
   2743   if (!BE)
   2744     return;
   2745 
   2746   ArgEffect AE = IncRef;
   2747 
   2748   switch (BE->getBridgeKind()) {
   2749     case clang::OBC_Bridge:
   2750       // Do nothing.
   2751       return;
   2752     case clang::OBC_BridgeRetained:
   2753       AE = IncRef;
   2754       break;
   2755     case clang::OBC_BridgeTransfer:
   2756       AE = DecRefBridgedTransferred;
   2757       break;
   2758   }
   2759 
   2760   ProgramStateRef state = C.getState();
   2761   SymbolRef Sym = state->getSVal(CE, C.getLocationContext()).getAsLocSymbol();
   2762   if (!Sym)
   2763     return;
   2764   const RefVal* T = getRefBinding(state, Sym);
   2765   if (!T)
   2766     return;
   2767 
   2768   RefVal::Kind hasErr = (RefVal::Kind) 0;
   2769   state = updateSymbol(state, Sym, *T, AE, hasErr, C);
   2770 
   2771   if (hasErr) {
   2772     // FIXME: If we get an error during a bridge cast, should we report it?
   2773     return;
   2774   }
   2775 
   2776   C.addTransition(state);
   2777 }
   2778 
   2779 void RetainCountChecker::processObjCLiterals(CheckerContext &C,
   2780                                              const Expr *Ex) const {
   2781   ProgramStateRef state = C.getState();
   2782   const ExplodedNode *pred = C.getPredecessor();
   2783   for (const Stmt *Child : Ex->children()) {
   2784     SVal V = state->getSVal(Child, pred->getLocationContext());
   2785     if (SymbolRef sym = V.getAsSymbol())
   2786       if (const RefVal* T = getRefBinding(state, sym)) {
   2787         RefVal::Kind hasErr = (RefVal::Kind) 0;
   2788         state = updateSymbol(state, sym, *T, MayEscape, hasErr, C);
   2789         if (hasErr) {
   2790           processNonLeakError(state, Child->getSourceRange(), hasErr, sym, C);
   2791           return;
   2792         }
   2793       }
   2794   }
   2795 
   2796   // Return the object as autoreleased.
   2797   //  RetEffect RE = RetEffect::MakeNotOwned(RetEffect::ObjC);
   2798   if (SymbolRef sym =
   2799         state->getSVal(Ex, pred->getLocationContext()).getAsSymbol()) {
   2800     QualType ResultTy = Ex->getType();
   2801     state = setRefBinding(state, sym,
   2802                           RefVal::makeNotOwned(RetEffect::ObjC, ResultTy));
   2803   }
   2804 
   2805   C.addTransition(state);
   2806 }
   2807 
   2808 void RetainCountChecker::checkPostStmt(const ObjCArrayLiteral *AL,
   2809                                        CheckerContext &C) const {
   2810   // Apply the 'MayEscape' to all values.
   2811   processObjCLiterals(C, AL);
   2812 }
   2813 
   2814 void RetainCountChecker::checkPostStmt(const ObjCDictionaryLiteral *DL,
   2815                                        CheckerContext &C) const {
   2816   // Apply the 'MayEscape' to all keys and values.
   2817   processObjCLiterals(C, DL);
   2818 }
   2819 
   2820 void RetainCountChecker::checkPostStmt(const ObjCBoxedExpr *Ex,
   2821                                        CheckerContext &C) const {
   2822   const ExplodedNode *Pred = C.getPredecessor();
   2823   const LocationContext *LCtx = Pred->getLocationContext();
   2824   ProgramStateRef State = Pred->getState();
   2825 
   2826   if (SymbolRef Sym = State->getSVal(Ex, LCtx).getAsSymbol()) {
   2827     QualType ResultTy = Ex->getType();
   2828     State = setRefBinding(State, Sym,
   2829                           RefVal::makeNotOwned(RetEffect::ObjC, ResultTy));
   2830   }
   2831 
   2832   C.addTransition(State);
   2833 }
   2834 
   2835 static bool wasLoadedFromIvar(SymbolRef Sym) {
   2836   if (auto DerivedVal = dyn_cast<SymbolDerived>(Sym))
   2837     return isa<ObjCIvarRegion>(DerivedVal->getRegion());
   2838   if (auto RegionVal = dyn_cast<SymbolRegionValue>(Sym))
   2839     return isa<ObjCIvarRegion>(RegionVal->getRegion());
   2840   return false;
   2841 }
   2842 
   2843 void RetainCountChecker::checkPostStmt(const ObjCIvarRefExpr *IRE,
   2844                                        CheckerContext &C) const {
   2845   Optional<Loc> IVarLoc = C.getSVal(IRE).getAs<Loc>();
   2846   if (!IVarLoc)
   2847     return;
   2848 
   2849   ProgramStateRef State = C.getState();
   2850   SymbolRef Sym = State->getSVal(*IVarLoc).getAsSymbol();
   2851   if (!Sym || !wasLoadedFromIvar(Sym))
   2852     return;
   2853 
   2854   // Accessing an ivar directly is unusual. If we've done that, be more
   2855   // forgiving about what the surrounding code is allowed to do.
   2856 
   2857   QualType Ty = Sym->getType();
   2858   RetEffect::ObjKind Kind;
   2859   if (Ty->isObjCRetainableType())
   2860     Kind = RetEffect::ObjC;
   2861   else if (coreFoundation::isCFObjectRef(Ty))
   2862     Kind = RetEffect::CF;
   2863   else
   2864     return;
   2865 
   2866   // If the value is already known to be nil, don't bother tracking it.
   2867   ConstraintManager &CMgr = State->getConstraintManager();
   2868   if (CMgr.isNull(State, Sym).isConstrainedTrue())
   2869     return;
   2870 
   2871   if (const RefVal *RV = getRefBinding(State, Sym)) {
   2872     // If we've seen this symbol before, or we're only seeing it now because
   2873     // of something the analyzer has synthesized, don't do anything.
   2874     if (RV->getIvarAccessHistory() != RefVal::IvarAccessHistory::None ||
   2875         isSynthesizedAccessor(C.getStackFrame())) {
   2876       return;
   2877     }
   2878 
   2879     // Note that this value has been loaded from an ivar.
   2880     C.addTransition(setRefBinding(State, Sym, RV->withIvarAccess()));
   2881     return;
   2882   }
   2883 
   2884   RefVal PlusZero = RefVal::makeNotOwned(Kind, Ty);
   2885 
   2886   // In a synthesized accessor, the effective retain count is +0.
   2887   if (isSynthesizedAccessor(C.getStackFrame())) {
   2888     C.addTransition(setRefBinding(State, Sym, PlusZero));
   2889     return;
   2890   }
   2891 
   2892   State = setRefBinding(State, Sym, PlusZero.withIvarAccess());
   2893   C.addTransition(State);
   2894 }
   2895 
   2896 void RetainCountChecker::checkPostCall(const CallEvent &Call,
   2897                                        CheckerContext &C) const {
   2898   RetainSummaryManager &Summaries = getSummaryManager(C);
   2899   const RetainSummary *Summ = Summaries.getSummary(Call, C.getState());
   2900 
   2901   if (C.wasInlined) {
   2902     processSummaryOfInlined(*Summ, Call, C);
   2903     return;
   2904   }
   2905   checkSummary(*Summ, Call, C);
   2906 }
   2907 
   2908 /// GetReturnType - Used to get the return type of a message expression or
   2909 ///  function call with the intention of affixing that type to a tracked symbol.
   2910 ///  While the return type can be queried directly from RetEx, when
   2911 ///  invoking class methods we augment to the return type to be that of
   2912 ///  a pointer to the class (as opposed it just being id).
   2913 // FIXME: We may be able to do this with related result types instead.
   2914 // This function is probably overestimating.
   2915 static QualType GetReturnType(const Expr *RetE, ASTContext &Ctx) {
   2916   QualType RetTy = RetE->getType();
   2917   // If RetE is not a message expression just return its type.
   2918   // If RetE is a message expression, return its types if it is something
   2919   /// more specific than id.
   2920   if (const ObjCMessageExpr *ME = dyn_cast<ObjCMessageExpr>(RetE))
   2921     if (const ObjCObjectPointerType *PT = RetTy->getAs<ObjCObjectPointerType>())
   2922       if (PT->isObjCQualifiedIdType() || PT->isObjCIdType() ||
   2923           PT->isObjCClassType()) {
   2924         // At this point we know the return type of the message expression is
   2925         // id, id<...>, or Class. If we have an ObjCInterfaceDecl, we know this
   2926         // is a call to a class method whose type we can resolve.  In such
   2927         // cases, promote the return type to XXX* (where XXX is the class).
   2928         const ObjCInterfaceDecl *D = ME->getReceiverInterface();
   2929         return !D ? RetTy :
   2930                     Ctx.getObjCObjectPointerType(Ctx.getObjCInterfaceType(D));
   2931       }
   2932 
   2933   return RetTy;
   2934 }
   2935 
   2936 // We don't always get the exact modeling of the function with regards to the
   2937 // retain count checker even when the function is inlined. For example, we need
   2938 // to stop tracking the symbols which were marked with StopTrackingHard.
   2939 void RetainCountChecker::processSummaryOfInlined(const RetainSummary &Summ,
   2940                                                  const CallEvent &CallOrMsg,
   2941                                                  CheckerContext &C) const {
   2942   ProgramStateRef state = C.getState();
   2943 
   2944   // Evaluate the effect of the arguments.
   2945   for (unsigned idx = 0, e = CallOrMsg.getNumArgs(); idx != e; ++idx) {
   2946     if (Summ.getArg(idx) == StopTrackingHard) {
   2947       SVal V = CallOrMsg.getArgSVal(idx);
   2948       if (SymbolRef Sym = V.getAsLocSymbol()) {
   2949         state = removeRefBinding(state, Sym);
   2950       }
   2951     }
   2952   }
   2953 
   2954   // Evaluate the effect on the message receiver.
   2955   const ObjCMethodCall *MsgInvocation = dyn_cast<ObjCMethodCall>(&CallOrMsg);
   2956   if (MsgInvocation) {
   2957     if (SymbolRef Sym = MsgInvocation->getReceiverSVal().getAsLocSymbol()) {
   2958       if (Summ.getReceiverEffect() == StopTrackingHard) {
   2959         state = removeRefBinding(state, Sym);
   2960       }
   2961     }
   2962   }
   2963 
   2964   // Consult the summary for the return value.
   2965   RetEffect RE = Summ.getRetEffect();
   2966   if (RE.getKind() == RetEffect::NoRetHard) {
   2967     SymbolRef Sym = CallOrMsg.getReturnValue().getAsSymbol();
   2968     if (Sym)
   2969       state = removeRefBinding(state, Sym);
   2970   }
   2971 
   2972   C.addTransition(state);
   2973 }
   2974 
   2975 static ProgramStateRef updateOutParameter(ProgramStateRef State,
   2976                                           SVal ArgVal,
   2977                                           ArgEffect Effect) {
   2978   auto *ArgRegion = dyn_cast_or_null<TypedValueRegion>(ArgVal.getAsRegion());
   2979   if (!ArgRegion)
   2980     return State;
   2981 
   2982   QualType PointeeTy = ArgRegion->getValueType();
   2983   if (!coreFoundation::isCFObjectRef(PointeeTy))
   2984     return State;
   2985 
   2986   SVal PointeeVal = State->getSVal(ArgRegion);
   2987   SymbolRef Pointee = PointeeVal.getAsLocSymbol();
   2988   if (!Pointee)
   2989     return State;
   2990 
   2991   switch (Effect) {
   2992   case UnretainedOutParameter:
   2993     State = setRefBinding(State, Pointee,
   2994                           RefVal::makeNotOwned(RetEffect::CF, PointeeTy));
   2995     break;
   2996   case RetainedOutParameter:
   2997     // Do nothing. Retained out parameters will either point to a +1 reference
   2998     // or NULL, but the way you check for failure differs depending on the API.
   2999     // Consequently, we don't have a good way to track them yet.
   3000     break;
   3001 
   3002   default:
   3003     llvm_unreachable("only for out parameters");
   3004   }
   3005 
   3006   return State;
   3007 }
   3008 
   3009 void RetainCountChecker::checkSummary(const RetainSummary &Summ,
   3010                                       const CallEvent &CallOrMsg,
   3011                                       CheckerContext &C) const {
   3012   ProgramStateRef state = C.getState();
   3013 
   3014   // Evaluate the effect of the arguments.
   3015   RefVal::Kind hasErr = (RefVal::Kind) 0;
   3016   SourceRange ErrorRange;
   3017   SymbolRef ErrorSym = nullptr;
   3018 
   3019   for (unsigned idx = 0, e = CallOrMsg.getNumArgs(); idx != e; ++idx) {
   3020     SVal V = CallOrMsg.getArgSVal(idx);
   3021 
   3022     ArgEffect Effect = Summ.getArg(idx);
   3023     if (Effect == RetainedOutParameter || Effect == UnretainedOutParameter) {
   3024       state = updateOutParameter(state, V, Effect);
   3025     } else if (SymbolRef Sym = V.getAsLocSymbol()) {
   3026       if (const RefVal *T = getRefBinding(state, Sym)) {
   3027         state = updateSymbol(state, Sym, *T, Effect, hasErr, C);
   3028         if (hasErr) {
   3029           ErrorRange = CallOrMsg.getArgSourceRange(idx);
   3030           ErrorSym = Sym;
   3031           break;
   3032         }
   3033       }
   3034     }
   3035   }
   3036 
   3037   // Evaluate the effect on the message receiver.
   3038   bool ReceiverIsTracked = false;
   3039   if (!hasErr) {
   3040     const ObjCMethodCall *MsgInvocation = dyn_cast<ObjCMethodCall>(&CallOrMsg);
   3041     if (MsgInvocation) {
   3042       if (SymbolRef Sym = MsgInvocation->getReceiverSVal().getAsLocSymbol()) {
   3043         if (const RefVal *T = getRefBinding(state, Sym)) {
   3044           ReceiverIsTracked = true;
   3045           state = updateSymbol(state, Sym, *T, Summ.getReceiverEffect(),
   3046                                  hasErr, C);
   3047           if (hasErr) {
   3048             ErrorRange = MsgInvocation->getOriginExpr()->getReceiverRange();
   3049             ErrorSym = Sym;
   3050           }
   3051         }
   3052       }
   3053     }
   3054   }
   3055 
   3056   // Process any errors.
   3057   if (hasErr) {
   3058     processNonLeakError(state, ErrorRange, hasErr, ErrorSym, C);
   3059     return;
   3060   }
   3061 
   3062   // Consult the summary for the return value.
   3063   RetEffect RE = Summ.getRetEffect();
   3064 
   3065   if (RE.getKind() == RetEffect::OwnedWhenTrackedReceiver) {
   3066     if (ReceiverIsTracked)
   3067       RE = getSummaryManager(C).getObjAllocRetEffect();
   3068     else
   3069       RE = RetEffect::MakeNoRet();
   3070   }
   3071 
   3072   switch (RE.getKind()) {
   3073     default:
   3074       llvm_unreachable("Unhandled RetEffect.");
   3075 
   3076     case RetEffect::NoRet:
   3077     case RetEffect::NoRetHard:
   3078       // No work necessary.
   3079       break;
   3080 
   3081     case RetEffect::OwnedAllocatedSymbol:
   3082     case RetEffect::OwnedSymbol: {
   3083       SymbolRef Sym = CallOrMsg.getReturnValue().getAsSymbol();
   3084       if (!Sym)
   3085         break;
   3086 
   3087       // Use the result type from the CallEvent as it automatically adjusts
   3088       // for methods/functions that return references.
   3089       QualType ResultTy = CallOrMsg.getResultType();
   3090       state = setRefBinding(state, Sym, RefVal::makeOwned(RE.getObjKind(),
   3091                                                           ResultTy));
   3092 
   3093       // FIXME: Add a flag to the checker where allocations are assumed to
   3094       // *not* fail.
   3095       break;
   3096     }
   3097 
   3098     case RetEffect::GCNotOwnedSymbol:
   3099     case RetEffect::NotOwnedSymbol: {
   3100       const Expr *Ex = CallOrMsg.getOriginExpr();
   3101       SymbolRef Sym = CallOrMsg.getReturnValue().getAsSymbol();
   3102       if (!Sym)
   3103         break;
   3104       assert(Ex);
   3105       // Use GetReturnType in order to give [NSFoo alloc] the type NSFoo *.
   3106       QualType ResultTy = GetReturnType(Ex, C.getASTContext());
   3107       state = setRefBinding(state, Sym, RefVal::makeNotOwned(RE.getObjKind(),
   3108                                                              ResultTy));
   3109       break;
   3110     }
   3111   }
   3112 
   3113   // This check is actually necessary; otherwise the statement builder thinks
   3114   // we've hit a previously-found path.
   3115   // Normally addTransition takes care of this, but we want the node pointer.
   3116   ExplodedNode *NewNode;
   3117   if (state == C.getState()) {
   3118     NewNode = C.getPredecessor();
   3119   } else {
   3120     NewNode = C.addTransition(state);
   3121   }
   3122 
   3123   // Annotate the node with summary we used.
   3124   if (NewNode) {
   3125     // FIXME: This is ugly. See checkEndAnalysis for why it's necessary.
   3126     if (ShouldResetSummaryLog) {
   3127       SummaryLog.clear();
   3128       ShouldResetSummaryLog = false;
   3129     }
   3130     SummaryLog[NewNode] = &Summ;
   3131   }
   3132 }
   3133 
   3134 ProgramStateRef
   3135 RetainCountChecker::updateSymbol(ProgramStateRef state, SymbolRef sym,
   3136                                  RefVal V, ArgEffect E, RefVal::Kind &hasErr,
   3137                                  CheckerContext &C) const {
   3138   // In GC mode [... release] and [... retain] do nothing.
   3139   // In ARC mode they shouldn't exist at all, but we just ignore them.
   3140   bool IgnoreRetainMsg = C.isObjCGCEnabled();
   3141   if (!IgnoreRetainMsg)
   3142     IgnoreRetainMsg = (bool)C.getASTContext().getLangOpts().ObjCAutoRefCount;
   3143 
   3144   switch (E) {
   3145   default:
   3146     break;
   3147   case IncRefMsg:
   3148     E = IgnoreRetainMsg ? DoNothing : IncRef;
   3149     break;
   3150   case DecRefMsg:
   3151     E = IgnoreRetainMsg ? DoNothing : DecRef;
   3152     break;
   3153   case DecRefMsgAndStopTrackingHard:
   3154     E = IgnoreRetainMsg ? StopTracking : DecRefAndStopTrackingHard;
   3155     break;
   3156   case MakeCollectable:
   3157     E = C.isObjCGCEnabled() ? DecRef : DoNothing;
   3158     break;
   3159   }
   3160 
   3161   // Handle all use-after-releases.
   3162   if (!C.isObjCGCEnabled() && V.getKind() == RefVal::Released) {
   3163     V = V ^ RefVal::ErrorUseAfterRelease;
   3164     hasErr = V.getKind();
   3165     return setRefBinding(state, sym, V);
   3166   }
   3167 
   3168   switch (E) {
   3169     case DecRefMsg:
   3170     case IncRefMsg:
   3171     case MakeCollectable:
   3172     case DecRefMsgAndStopTrackingHard:
   3173       llvm_unreachable("DecRefMsg/IncRefMsg/MakeCollectable already converted");
   3174 
   3175     case UnretainedOutParameter:
   3176     case RetainedOutParameter:
   3177       llvm_unreachable("Applies to pointer-to-pointer parameters, which should "
   3178                        "not have ref state.");
   3179 
   3180     case Dealloc:
   3181       // Any use of -dealloc in GC is *bad*.
   3182       if (C.isObjCGCEnabled()) {
   3183         V = V ^ RefVal::ErrorDeallocGC;
   3184         hasErr = V.getKind();
   3185         break;
   3186       }
   3187 
   3188       switch (V.getKind()) {
   3189         default:
   3190           llvm_unreachable("Invalid RefVal state for an explicit dealloc.");
   3191         case RefVal::Owned:
   3192           // The object immediately transitions to the released state.
   3193           V = V ^ RefVal::Released;
   3194           V.clearCounts();
   3195           return setRefBinding(state, sym, V);
   3196         case RefVal::NotOwned:
   3197           V = V ^ RefVal::ErrorDeallocNotOwned;
   3198           hasErr = V.getKind();
   3199           break;
   3200       }
   3201       break;
   3202 
   3203     case MayEscape:
   3204       if (V.getKind() == RefVal::Owned) {
   3205         V = V ^ RefVal::NotOwned;
   3206         break;
   3207       }
   3208 
   3209       // Fall-through.
   3210 
   3211     case DoNothing:
   3212       return state;
   3213 
   3214     case Autorelease:
   3215       if (C.isObjCGCEnabled())
   3216         return state;
   3217       // Update the autorelease counts.
   3218       V = V.autorelease();
   3219       break;
   3220 
   3221     case StopTracking:
   3222     case StopTrackingHard:
   3223       return removeRefBinding(state, sym);
   3224 
   3225     case IncRef:
   3226       switch (V.getKind()) {
   3227         default:
   3228           llvm_unreachable("Invalid RefVal state for a retain.");
   3229         case RefVal::Owned:
   3230         case RefVal::NotOwned:
   3231           V = V + 1;
   3232           break;
   3233         case RefVal::Released:
   3234           // Non-GC cases are handled above.
   3235           assert(C.isObjCGCEnabled());
   3236           V = (V ^ RefVal::Owned) + 1;
   3237           break;
   3238       }
   3239       break;
   3240 
   3241     case DecRef:
   3242     case DecRefBridgedTransferred:
   3243     case DecRefAndStopTrackingHard:
   3244       switch (V.getKind()) {
   3245         default:
   3246           // case 'RefVal::Released' handled above.
   3247           llvm_unreachable("Invalid RefVal state for a release.");
   3248 
   3249         case RefVal::Owned:
   3250           assert(V.getCount() > 0);
   3251           if (V.getCount() == 1) {
   3252             if (E == DecRefBridgedTransferred ||
   3253                 V.getIvarAccessHistory() ==
   3254                   RefVal::IvarAccessHistory::AccessedDirectly)
   3255               V = V ^ RefVal::NotOwned;
   3256             else
   3257               V = V ^ RefVal::Released;
   3258           } else if (E == DecRefAndStopTrackingHard) {
   3259             return removeRefBinding(state, sym);
   3260           }
   3261 
   3262           V = V - 1;
   3263           break;
   3264 
   3265         case RefVal::NotOwned:
   3266           if (V.getCount() > 0) {
   3267             if (E == DecRefAndStopTrackingHard)
   3268               return removeRefBinding(state, sym);
   3269             V = V - 1;
   3270           } else if (V.getIvarAccessHistory() ==
   3271                        RefVal::IvarAccessHistory::AccessedDirectly) {
   3272             // Assume that the instance variable was holding on the object at
   3273             // +1, and we just didn't know.
   3274             if (E == DecRefAndStopTrackingHard)
   3275               return removeRefBinding(state, sym);
   3276             V = V.releaseViaIvar() ^ RefVal::Released;
   3277           } else {
   3278             V = V ^ RefVal::ErrorReleaseNotOwned;
   3279             hasErr = V.getKind();
   3280           }
   3281           break;
   3282 
   3283         case RefVal::Released:
   3284           // Non-GC cases are handled above.
   3285           assert(C.isObjCGCEnabled());
   3286           V = V ^ RefVal::ErrorUseAfterRelease;
   3287           hasErr = V.getKind();
   3288           break;
   3289       }
   3290       break;
   3291   }
   3292   return setRefBinding(state, sym, V);
   3293 }
   3294 
   3295 void RetainCountChecker::processNonLeakError(ProgramStateRef St,
   3296                                              SourceRange ErrorRange,
   3297                                              RefVal::Kind ErrorKind,
   3298                                              SymbolRef Sym,
   3299                                              CheckerContext &C) const {
   3300   // HACK: Ignore retain-count issues on values accessed through ivars,
   3301   // because of cases like this:
   3302   //   [_contentView retain];
   3303   //   [_contentView removeFromSuperview];
   3304   //   [self addSubview:_contentView]; // invalidates 'self'
   3305   //   [_contentView release];
   3306   if (const RefVal *RV = getRefBinding(St, Sym))
   3307     if (RV->getIvarAccessHistory() != RefVal::IvarAccessHistory::None)
   3308       return;
   3309 
   3310   ExplodedNode *N = C.generateErrorNode(St);
   3311   if (!N)
   3312     return;
   3313 
   3314   CFRefBug *BT;
   3315   switch (ErrorKind) {
   3316     default:
   3317       llvm_unreachable("Unhandled error.");
   3318     case RefVal::ErrorUseAfterRelease:
   3319       if (!useAfterRelease)
   3320         useAfterRelease.reset(new UseAfterRelease(this));
   3321       BT = useAfterRelease.get();
   3322       break;
   3323     case RefVal::ErrorReleaseNotOwned:
   3324       if (!releaseNotOwned)
   3325         releaseNotOwned.reset(new BadRelease(this));
   3326       BT = releaseNotOwned.get();
   3327       break;
   3328     case RefVal::ErrorDeallocGC:
   3329       if (!deallocGC)
   3330         deallocGC.reset(new DeallocGC(this));
   3331       BT = deallocGC.get();
   3332       break;
   3333     case RefVal::ErrorDeallocNotOwned:
   3334       if (!deallocNotOwned)
   3335         deallocNotOwned.reset(new DeallocNotOwned(this));
   3336       BT = deallocNotOwned.get();
   3337       break;
   3338   }
   3339 
   3340   assert(BT);
   3341   auto report = std::unique_ptr<BugReport>(
   3342       new CFRefReport(*BT, C.getASTContext().getLangOpts(), C.isObjCGCEnabled(),
   3343                       SummaryLog, N, Sym));
   3344   report->addRange(ErrorRange);
   3345   C.emitReport(std::move(report));
   3346 }
   3347 
   3348 //===----------------------------------------------------------------------===//
   3349 // Handle the return values of retain-count-related functions.
   3350 //===----------------------------------------------------------------------===//
   3351 
   3352 bool RetainCountChecker::evalCall(const CallExpr *CE, CheckerContext &C) const {
   3353   // Get the callee. We're only interested in simple C functions.
   3354   ProgramStateRef state = C.getState();
   3355   const FunctionDecl *FD = C.getCalleeDecl(CE);
   3356   if (!FD)
   3357     return false;
   3358 
   3359   IdentifierInfo *II = FD->getIdentifier();
   3360   if (!II)
   3361     return false;
   3362 
   3363   // For now, we're only handling the functions that return aliases of their
   3364   // arguments: CFRetain and CFMakeCollectable (and their families).
   3365   // Eventually we should add other functions we can model entirely,
   3366   // such as CFRelease, which don't invalidate their arguments or globals.
   3367   if (CE->getNumArgs() != 1)
   3368     return false;
   3369 
   3370   // Get the name of the function.
   3371   StringRef FName = II->getName();
   3372   FName = FName.substr(FName.find_first_not_of('_'));
   3373 
   3374   // See if it's one of the specific functions we know how to eval.
   3375   bool canEval = false;
   3376 
   3377   QualType ResultTy = CE->getCallReturnType(C.getASTContext());
   3378   if (ResultTy->isObjCIdType()) {
   3379     // Handle: id NSMakeCollectable(CFTypeRef)
   3380     canEval = II->isStr("NSMakeCollectable");
   3381   } else if (ResultTy->isPointerType()) {
   3382     // Handle: (CF|CG)Retain
   3383     //         CFAutorelease
   3384     //         CFMakeCollectable
   3385     // It's okay to be a little sloppy here (CGMakeCollectable doesn't exist).
   3386     if (cocoa::isRefType(ResultTy, "CF", FName) ||
   3387         cocoa::isRefType(ResultTy, "CG", FName)) {
   3388       canEval = isRetain(FD, FName) || isAutorelease(FD, FName) ||
   3389                 isMakeCollectable(FD, FName);
   3390     }
   3391   }
   3392 
   3393   if (!canEval)
   3394     return false;
   3395 
   3396   // Bind the return value.
   3397   const LocationContext *LCtx = C.getLocationContext();
   3398   SVal RetVal = state->getSVal(CE->getArg(0), LCtx);
   3399   if (RetVal.isUnknown()) {
   3400     // If the receiver is unknown, conjure a return value.
   3401     SValBuilder &SVB = C.getSValBuilder();
   3402     RetVal = SVB.conjureSymbolVal(nullptr, CE, LCtx, ResultTy, C.blockCount());
   3403   }
   3404   state = state->BindExpr(CE, LCtx, RetVal, false);
   3405 
   3406   // FIXME: This should not be necessary, but otherwise the argument seems to be
   3407   // considered alive during the next statement.
   3408   if (const MemRegion *ArgRegion = RetVal.getAsRegion()) {
   3409     // Save the refcount status of the argument.
   3410     SymbolRef Sym = RetVal.getAsLocSymbol();
   3411     const RefVal *Binding = nullptr;
   3412     if (Sym)
   3413       Binding = getRefBinding(state, Sym);
   3414 
   3415     // Invalidate the argument region.
   3416     state = state->invalidateRegions(ArgRegion, CE, C.blockCount(), LCtx,
   3417                                      /*CausesPointerEscape*/ false);
   3418 
   3419     // Restore the refcount status of the argument.
   3420     if (Binding)
   3421       state = setRefBinding(state, Sym, *Binding);
   3422   }
   3423 
   3424   C.addTransition(state);
   3425   return true;
   3426 }
   3427 
   3428 //===----------------------------------------------------------------------===//
   3429 // Handle return statements.
   3430 //===----------------------------------------------------------------------===//
   3431 
   3432 void RetainCountChecker::checkPreStmt(const ReturnStmt *S,
   3433                                       CheckerContext &C) const {
   3434 
   3435   // Only adjust the reference count if this is the top-level call frame,
   3436   // and not the result of inlining.  In the future, we should do
   3437   // better checking even for inlined calls, and see if they match
   3438   // with their expected semantics (e.g., the method should return a retained
   3439   // object, etc.).
   3440   if (!C.inTopFrame())
   3441     return;
   3442 
   3443   const Expr *RetE = S->getRetValue();
   3444   if (!RetE)
   3445     return;
   3446 
   3447   ProgramStateRef state = C.getState();
   3448   SymbolRef Sym =
   3449     state->getSValAsScalarOrLoc(RetE, C.getLocationContext()).getAsLocSymbol();
   3450   if (!Sym)
   3451     return;
   3452 
   3453   // Get the reference count binding (if any).
   3454   const RefVal *T = getRefBinding(state, Sym);
   3455   if (!T)
   3456     return;
   3457 
   3458   // Change the reference count.
   3459   RefVal X = *T;
   3460 
   3461   switch (X.getKind()) {
   3462     case RefVal::Owned: {
   3463       unsigned cnt = X.getCount();
   3464       assert(cnt > 0);
   3465       X.setCount(cnt - 1);
   3466       X = X ^ RefVal::ReturnedOwned;
   3467       break;
   3468     }
   3469 
   3470     case RefVal::NotOwned: {
   3471       unsigned cnt = X.getCount();
   3472       if (cnt) {
   3473         X.setCount(cnt - 1);
   3474         X = X ^ RefVal::ReturnedOwned;
   3475       }
   3476       else {
   3477         X = X ^ RefVal::ReturnedNotOwned;
   3478       }
   3479       break;
   3480     }
   3481 
   3482     default:
   3483       return;
   3484   }
   3485 
   3486   // Update the binding.
   3487   state = setRefBinding(state, Sym, X);
   3488   ExplodedNode *Pred = C.addTransition(state);
   3489 
   3490   // At this point we have updated the state properly.
   3491   // Everything after this is merely checking to see if the return value has
   3492   // been over- or under-retained.
   3493 
   3494   // Did we cache out?
   3495   if (!Pred)
   3496     return;
   3497 
   3498   // Update the autorelease counts.
   3499   static CheckerProgramPointTag AutoreleaseTag(this, "Autorelease");
   3500   state = handleAutoreleaseCounts(state, Pred, &AutoreleaseTag, C, Sym, X);
   3501 
   3502   // Did we cache out?
   3503   if (!state)
   3504     return;
   3505 
   3506   // Get the updated binding.
   3507   T = getRefBinding(state, Sym);
   3508   assert(T);
   3509   X = *T;
   3510 
   3511   // Consult the summary of the enclosing method.
   3512   RetainSummaryManager &Summaries = getSummaryManager(C);
   3513   const Decl *CD = &Pred->getCodeDecl();
   3514   RetEffect RE = RetEffect::MakeNoRet();
   3515 
   3516   // FIXME: What is the convention for blocks? Is there one?
   3517   if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(CD)) {
   3518     const RetainSummary *Summ = Summaries.getMethodSummary(MD);
   3519     RE = Summ->getRetEffect();
   3520   } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CD)) {
   3521     if (!isa<CXXMethodDecl>(FD)) {
   3522       const RetainSummary *Summ = Summaries.getFunctionSummary(FD);
   3523       RE = Summ->getRetEffect();
   3524     }
   3525   }
   3526 
   3527   checkReturnWithRetEffect(S, C, Pred, RE, X, Sym, state);
   3528 }
   3529 
   3530 void RetainCountChecker::checkReturnWithRetEffect(const ReturnStmt *S,
   3531                                                   CheckerContext &C,
   3532                                                   ExplodedNode *Pred,
   3533                                                   RetEffect RE, RefVal X,
   3534                                                   SymbolRef Sym,
   3535                                                   ProgramStateRef state) const {
   3536   // HACK: Ignore retain-count issues on values accessed through ivars,
   3537   // because of cases like this:
   3538   //   [_contentView retain];
   3539   //   [_contentView removeFromSuperview];
   3540   //   [self addSubview:_contentView]; // invalidates 'self'
   3541   //   [_contentView release];
   3542   if (X.getIvarAccessHistory() != RefVal::IvarAccessHistory::None)
   3543     return;
   3544 
   3545   // Any leaks or other errors?
   3546   if (X.isReturnedOwned() && X.getCount() == 0) {
   3547     if (RE.getKind() != RetEffect::NoRet) {
   3548       bool hasError = false;
   3549       if (C.isObjCGCEnabled() && RE.getObjKind() == RetEffect::ObjC) {
   3550         // Things are more complicated with garbage collection.  If the
   3551         // returned object is suppose to be an Objective-C object, we have
   3552         // a leak (as the caller expects a GC'ed object) because no
   3553         // method should return ownership unless it returns a CF object.
   3554         hasError = true;
   3555         X = X ^ RefVal::ErrorGCLeakReturned;
   3556       }
   3557       else if (!RE.isOwned()) {
   3558         // Either we are using GC and the returned object is a CF type
   3559         // or we aren't using GC.  In either case, we expect that the
   3560         // enclosing method is expected to return ownership.
   3561         hasError = true;
   3562         X = X ^ RefVal::ErrorLeakReturned;
   3563       }
   3564 
   3565       if (hasError) {
   3566         // Generate an error node.
   3567         state = setRefBinding(state, Sym, X);
   3568 
   3569         static CheckerProgramPointTag ReturnOwnLeakTag(this, "ReturnsOwnLeak");
   3570         ExplodedNode *N = C.addTransition(state, Pred, &ReturnOwnLeakTag);
   3571         if (N) {
   3572           const LangOptions &LOpts = C.getASTContext().getLangOpts();
   3573           bool GCEnabled = C.isObjCGCEnabled();
   3574           C.emitReport(std::unique_ptr<BugReport>(new CFRefLeakReport(
   3575               *getLeakAtReturnBug(LOpts, GCEnabled), LOpts, GCEnabled,
   3576               SummaryLog, N, Sym, C, IncludeAllocationLine)));
   3577         }
   3578       }
   3579     }
   3580   } else if (X.isReturnedNotOwned()) {
   3581     if (RE.isOwned()) {
   3582       if (X.getIvarAccessHistory() ==
   3583             RefVal::IvarAccessHistory::AccessedDirectly) {
   3584         // Assume the method was trying to transfer a +1 reference from a
   3585         // strong ivar to the caller.
   3586         state = setRefBinding(state, Sym,
   3587                               X.releaseViaIvar() ^ RefVal::ReturnedOwned);
   3588       } else {
   3589         // Trying to return a not owned object to a caller expecting an
   3590         // owned object.
   3591         state = setRefBinding(state, Sym, X ^ RefVal::ErrorReturnedNotOwned);
   3592 
   3593         static CheckerProgramPointTag
   3594             ReturnNotOwnedTag(this, "ReturnNotOwnedForOwned");
   3595 
   3596         ExplodedNode *N = C.addTransition(state, Pred, &ReturnNotOwnedTag);
   3597         if (N) {
   3598           if (!returnNotOwnedForOwned)
   3599             returnNotOwnedForOwned.reset(new ReturnedNotOwnedForOwned(this));
   3600 
   3601           C.emitReport(std::unique_ptr<BugReport>(new CFRefReport(
   3602               *returnNotOwnedForOwned, C.getASTContext().getLangOpts(),
   3603               C.isObjCGCEnabled(), SummaryLog, N, Sym)));
   3604         }
   3605       }
   3606     }
   3607   }
   3608 }
   3609 
   3610 //===----------------------------------------------------------------------===//
   3611 // Check various ways a symbol can be invalidated.
   3612 //===----------------------------------------------------------------------===//
   3613 
   3614 void RetainCountChecker::checkBind(SVal loc, SVal val, const Stmt *S,
   3615                                    CheckerContext &C) const {
   3616   // Are we storing to something that causes the value to "escape"?
   3617   bool escapes = true;
   3618 
   3619   // A value escapes in three possible cases (this may change):
   3620   //
   3621   // (1) we are binding to something that is not a memory region.
   3622   // (2) we are binding to a memregion that does not have stack storage
   3623   // (3) we are binding to a memregion with stack storage that the store
   3624   //     does not understand.
   3625   ProgramStateRef state = C.getState();
   3626 
   3627   if (Optional<loc::MemRegionVal> regionLoc = loc.getAs<loc::MemRegionVal>()) {
   3628     escapes = !regionLoc->getRegion()->hasStackStorage();
   3629 
   3630     if (!escapes) {
   3631       // To test (3), generate a new state with the binding added.  If it is
   3632       // the same state, then it escapes (since the store cannot represent
   3633       // the binding).
   3634       // Do this only if we know that the store is not supposed to generate the
   3635       // same state.
   3636       SVal StoredVal = state->getSVal(regionLoc->getRegion());
   3637       if (StoredVal != val)
   3638         escapes = (state == (state->bindLoc(*regionLoc, val)));
   3639     }
   3640     if (!escapes) {
   3641       // Case 4: We do not currently model what happens when a symbol is
   3642       // assigned to a struct field, so be conservative here and let the symbol
   3643       // go. TODO: This could definitely be improved upon.
   3644       escapes = !isa<VarRegion>(regionLoc->getRegion());
   3645     }
   3646   }
   3647 
   3648   // If we are storing the value into an auto function scope variable annotated
   3649   // with (__attribute__((cleanup))), stop tracking the value to avoid leak
   3650   // false positives.
   3651   if (const VarRegion *LVR = dyn_cast_or_null<VarRegion>(loc.getAsRegion())) {
   3652     const VarDecl *VD = LVR->getDecl();
   3653     if (VD->hasAttr<CleanupAttr>()) {
   3654       escapes = true;
   3655     }
   3656   }
   3657 
   3658   // If our store can represent the binding and we aren't storing to something
   3659   // that doesn't have local storage then just return and have the simulation
   3660   // state continue as is.
   3661   if (!escapes)
   3662       return;
   3663 
   3664   // Otherwise, find all symbols referenced by 'val' that we are tracking
   3665   // and stop tracking them.
   3666   state = state->scanReachableSymbols<StopTrackingCallback>(val).getState();
   3667   C.addTransition(state);
   3668 }
   3669 
   3670 ProgramStateRef RetainCountChecker::evalAssume(ProgramStateRef state,
   3671                                                    SVal Cond,
   3672                                                    bool Assumption) const {
   3673   // FIXME: We may add to the interface of evalAssume the list of symbols
   3674   //  whose assumptions have changed.  For now we just iterate through the
   3675   //  bindings and check if any of the tracked symbols are NULL.  This isn't
   3676   //  too bad since the number of symbols we will track in practice are
   3677   //  probably small and evalAssume is only called at branches and a few
   3678   //  other places.
   3679   RefBindingsTy B = state->get<RefBindings>();
   3680 
   3681   if (B.isEmpty())
   3682     return state;
   3683 
   3684   bool changed = false;
   3685   RefBindingsTy::Factory &RefBFactory = state->get_context<RefBindings>();
   3686 
   3687   for (RefBindingsTy::iterator I = B.begin(), E = B.end(); I != E; ++I) {
   3688     // Check if the symbol is null stop tracking the symbol.
   3689     ConstraintManager &CMgr = state->getConstraintManager();
   3690     ConditionTruthVal AllocFailed = CMgr.isNull(state, I.getKey());
   3691     if (AllocFailed.isConstrainedTrue()) {
   3692       changed = true;
   3693       B = RefBFactory.remove(B, I.getKey());
   3694     }
   3695   }
   3696 
   3697   if (changed)
   3698     state = state->set<RefBindings>(B);
   3699 
   3700   return state;
   3701 }
   3702 
   3703 ProgramStateRef
   3704 RetainCountChecker::checkRegionChanges(ProgramStateRef state,
   3705                                     const InvalidatedSymbols *invalidated,
   3706                                     ArrayRef<const MemRegion *> ExplicitRegions,
   3707                                     ArrayRef<const MemRegion *> Regions,
   3708                                     const CallEvent *Call) const {
   3709   if (!invalidated)
   3710     return state;
   3711 
   3712   llvm::SmallPtrSet<SymbolRef, 8> WhitelistedSymbols;
   3713   for (ArrayRef<const MemRegion *>::iterator I = ExplicitRegions.begin(),
   3714        E = ExplicitRegions.end(); I != E; ++I) {
   3715     if (const SymbolicRegion *SR = (*I)->StripCasts()->getAs<SymbolicRegion>())
   3716       WhitelistedSymbols.insert(SR->getSymbol());
   3717   }
   3718 
   3719   for (InvalidatedSymbols::const_iterator I=invalidated->begin(),
   3720        E = invalidated->end(); I!=E; ++I) {
   3721     SymbolRef sym = *I;
   3722     if (WhitelistedSymbols.count(sym))
   3723       continue;
   3724     // Remove any existing reference-count binding.
   3725     state = removeRefBinding(state, sym);
   3726   }
   3727   return state;
   3728 }
   3729 
   3730 //===----------------------------------------------------------------------===//
   3731 // Handle dead symbols and end-of-path.
   3732 //===----------------------------------------------------------------------===//
   3733 
   3734 ProgramStateRef
   3735 RetainCountChecker::handleAutoreleaseCounts(ProgramStateRef state,
   3736                                             ExplodedNode *Pred,
   3737                                             const ProgramPointTag *Tag,
   3738                                             CheckerContext &Ctx,
   3739                                             SymbolRef Sym, RefVal V) const {
   3740   unsigned ACnt = V.getAutoreleaseCount();
   3741 
   3742   // No autorelease counts?  Nothing to be done.
   3743   if (!ACnt)
   3744     return state;
   3745 
   3746   assert(!Ctx.isObjCGCEnabled() && "Autorelease counts in GC mode?");
   3747   unsigned Cnt = V.getCount();
   3748 
   3749   // FIXME: Handle sending 'autorelease' to already released object.
   3750 
   3751   if (V.getKind() == RefVal::ReturnedOwned)
   3752     ++Cnt;
   3753 
   3754   // If we would over-release here, but we know the value came from an ivar,
   3755   // assume it was a strong ivar that's just been relinquished.
   3756   if (ACnt > Cnt &&
   3757       V.getIvarAccessHistory() == RefVal::IvarAccessHistory::AccessedDirectly) {
   3758     V = V.releaseViaIvar();
   3759     --ACnt;
   3760   }
   3761 
   3762   if (ACnt <= Cnt) {
   3763     if (ACnt == Cnt) {
   3764       V.clearCounts();
   3765       if (V.getKind() == RefVal::ReturnedOwned)
   3766         V = V ^ RefVal::ReturnedNotOwned;
   3767       else
   3768         V = V ^ RefVal::NotOwned;
   3769     } else {
   3770       V.setCount(V.getCount() - ACnt);
   3771       V.setAutoreleaseCount(0);
   3772     }
   3773     return setRefBinding(state, Sym, V);
   3774   }
   3775 
   3776   // HACK: Ignore retain-count issues on values accessed through ivars,
   3777   // because of cases like this:
   3778   //   [_contentView retain];
   3779   //   [_contentView removeFromSuperview];
   3780   //   [self addSubview:_contentView]; // invalidates 'self'
   3781   //   [_contentView release];
   3782   if (V.getIvarAccessHistory() != RefVal::IvarAccessHistory::None)
   3783     return state;
   3784 
   3785   // Woah!  More autorelease counts then retain counts left.
   3786   // Emit hard error.
   3787   V = V ^ RefVal::ErrorOverAutorelease;
   3788   state = setRefBinding(state, Sym, V);
   3789 
   3790   ExplodedNode *N = Ctx.generateSink(state, Pred, Tag);
   3791   if (N) {
   3792     SmallString<128> sbuf;
   3793     llvm::raw_svector_ostream os(sbuf);
   3794     os << "Object was autoreleased ";
   3795     if (V.getAutoreleaseCount() > 1)
   3796       os << V.getAutoreleaseCount() << " times but the object ";
   3797     else
   3798       os << "but ";
   3799     os << "has a +" << V.getCount() << " retain count";
   3800 
   3801     if (!overAutorelease)
   3802       overAutorelease.reset(new OverAutorelease(this));
   3803 
   3804     const LangOptions &LOpts = Ctx.getASTContext().getLangOpts();
   3805     Ctx.emitReport(std::unique_ptr<BugReport>(
   3806         new CFRefReport(*overAutorelease, LOpts, /* GCEnabled = */ false,
   3807                         SummaryLog, N, Sym, os.str())));
   3808   }
   3809 
   3810   return nullptr;
   3811 }
   3812 
   3813 ProgramStateRef
   3814 RetainCountChecker::handleSymbolDeath(ProgramStateRef state,
   3815                                       SymbolRef sid, RefVal V,
   3816                                     SmallVectorImpl<SymbolRef> &Leaked) const {
   3817   bool hasLeak;
   3818 
   3819   // HACK: Ignore retain-count issues on values accessed through ivars,
   3820   // because of cases like this:
   3821   //   [_contentView retain];
   3822   //   [_contentView removeFromSuperview];
   3823   //   [self addSubview:_contentView]; // invalidates 'self'
   3824   //   [_contentView release];
   3825   if (V.getIvarAccessHistory() != RefVal::IvarAccessHistory::None)
   3826     hasLeak = false;
   3827   else if (V.isOwned())
   3828     hasLeak = true;
   3829   else if (V.isNotOwned() || V.isReturnedOwned())
   3830     hasLeak = (V.getCount() > 0);
   3831   else
   3832     hasLeak = false;
   3833 
   3834   if (!hasLeak)
   3835     return removeRefBinding(state, sid);
   3836 
   3837   Leaked.push_back(sid);
   3838   return setRefBinding(state, sid, V ^ RefVal::ErrorLeak);
   3839 }
   3840 
   3841 ExplodedNode *
   3842 RetainCountChecker::processLeaks(ProgramStateRef state,
   3843                                  SmallVectorImpl<SymbolRef> &Leaked,
   3844                                  CheckerContext &Ctx,
   3845                                  ExplodedNode *Pred) const {
   3846   // Generate an intermediate node representing the leak point.
   3847   ExplodedNode *N = Ctx.addTransition(state, Pred);
   3848 
   3849   if (N) {
   3850     for (SmallVectorImpl<SymbolRef>::iterator
   3851          I = Leaked.begin(), E = Leaked.end(); I != E; ++I) {
   3852 
   3853       const LangOptions &LOpts = Ctx.getASTContext().getLangOpts();
   3854       bool GCEnabled = Ctx.isObjCGCEnabled();
   3855       CFRefBug *BT = Pred ? getLeakWithinFunctionBug(LOpts, GCEnabled)
   3856                           : getLeakAtReturnBug(LOpts, GCEnabled);
   3857       assert(BT && "BugType not initialized.");
   3858 
   3859       Ctx.emitReport(std::unique_ptr<BugReport>(
   3860           new CFRefLeakReport(*BT, LOpts, GCEnabled, SummaryLog, N, *I, Ctx,
   3861                               IncludeAllocationLine)));
   3862     }
   3863   }
   3864 
   3865   return N;
   3866 }
   3867 
   3868 void RetainCountChecker::checkEndFunction(CheckerContext &Ctx) const {
   3869   ProgramStateRef state = Ctx.getState();
   3870   RefBindingsTy B = state->get<RefBindings>();
   3871   ExplodedNode *Pred = Ctx.getPredecessor();
   3872 
   3873   // Don't process anything within synthesized bodies.
   3874   const LocationContext *LCtx = Pred->getLocationContext();
   3875   if (LCtx->getAnalysisDeclContext()->isBodyAutosynthesized()) {
   3876     assert(LCtx->getParent());
   3877     return;
   3878   }
   3879 
   3880   for (RefBindingsTy::iterator I = B.begin(), E = B.end(); I != E; ++I) {
   3881     state = handleAutoreleaseCounts(state, Pred, /*Tag=*/nullptr, Ctx,
   3882                                     I->first, I->second);
   3883     if (!state)
   3884       return;
   3885   }
   3886 
   3887   // If the current LocationContext has a parent, don't check for leaks.
   3888   // We will do that later.
   3889   // FIXME: we should instead check for imbalances of the retain/releases,
   3890   // and suggest annotations.
   3891   if (LCtx->getParent())
   3892     return;
   3893 
   3894   B = state->get<RefBindings>();
   3895   SmallVector<SymbolRef, 10> Leaked;
   3896 
   3897   for (RefBindingsTy::iterator I = B.begin(), E = B.end(); I != E; ++I)
   3898     state = handleSymbolDeath(state, I->first, I->second, Leaked);
   3899 
   3900   processLeaks(state, Leaked, Ctx, Pred);
   3901 }
   3902 
   3903 const ProgramPointTag *
   3904 RetainCountChecker::getDeadSymbolTag(SymbolRef sym) const {
   3905   const CheckerProgramPointTag *&tag = DeadSymbolTags[sym];
   3906   if (!tag) {
   3907     SmallString<64> buf;
   3908     llvm::raw_svector_ostream out(buf);
   3909     out << "Dead Symbol : ";
   3910     sym->dumpToStream(out);
   3911     tag = new CheckerProgramPointTag(this, out.str());
   3912   }
   3913   return tag;
   3914 }
   3915 
   3916 void RetainCountChecker::checkDeadSymbols(SymbolReaper &SymReaper,
   3917                                           CheckerContext &C) const {
   3918   ExplodedNode *Pred = C.getPredecessor();
   3919 
   3920   ProgramStateRef state = C.getState();
   3921   RefBindingsTy B = state->get<RefBindings>();
   3922   SmallVector<SymbolRef, 10> Leaked;
   3923 
   3924   // Update counts from autorelease pools
   3925   for (SymbolReaper::dead_iterator I = SymReaper.dead_begin(),
   3926        E = SymReaper.dead_end(); I != E; ++I) {
   3927     SymbolRef Sym = *I;
   3928     if (const RefVal *T = B.lookup(Sym)){
   3929       // Use the symbol as the tag.
   3930       // FIXME: This might not be as unique as we would like.
   3931       const ProgramPointTag *Tag = getDeadSymbolTag(Sym);
   3932       state = handleAutoreleaseCounts(state, Pred, Tag, C, Sym, *T);
   3933       if (!state)
   3934         return;
   3935 
   3936       // Fetch the new reference count from the state, and use it to handle
   3937       // this symbol.
   3938       state = handleSymbolDeath(state, *I, *getRefBinding(state, Sym), Leaked);
   3939     }
   3940   }
   3941 
   3942   if (Leaked.empty()) {
   3943     C.addTransition(state);
   3944     return;
   3945   }
   3946 
   3947   Pred = processLeaks(state, Leaked, C, Pred);
   3948 
   3949   // Did we cache out?
   3950   if (!Pred)
   3951     return;
   3952 
   3953   // Now generate a new node that nukes the old bindings.
   3954   // The only bindings left at this point are the leaked symbols.
   3955   RefBindingsTy::Factory &F = state->get_context<RefBindings>();
   3956   B = state->get<RefBindings>();
   3957 
   3958   for (SmallVectorImpl<SymbolRef>::iterator I = Leaked.begin(),
   3959                                             E = Leaked.end();
   3960        I != E; ++I)
   3961     B = F.remove(B, *I);
   3962 
   3963   state = state->set<RefBindings>(B);
   3964   C.addTransition(state, Pred);
   3965 }
   3966 
   3967 void RetainCountChecker::printState(raw_ostream &Out, ProgramStateRef State,
   3968                                     const char *NL, const char *Sep) const {
   3969 
   3970   RefBindingsTy B = State->get<RefBindings>();
   3971 
   3972   if (B.isEmpty())
   3973     return;
   3974 
   3975   Out << Sep << NL;
   3976 
   3977   for (RefBindingsTy::iterator I = B.begin(), E = B.end(); I != E; ++I) {
   3978     Out << I->first << " : ";
   3979     I->second.print(Out);
   3980     Out << NL;
   3981   }
   3982 }
   3983 
   3984 //===----------------------------------------------------------------------===//
   3985 // Checker registration.
   3986 //===----------------------------------------------------------------------===//
   3987 
   3988 void ento::registerRetainCountChecker(CheckerManager &Mgr) {
   3989   Mgr.registerChecker<RetainCountChecker>(Mgr.getAnalyzerOptions());
   3990 }
   3991 
   3992 //===----------------------------------------------------------------------===//
   3993 // Implementation of the CallEffects API.
   3994 //===----------------------------------------------------------------------===//
   3995 
   3996 namespace clang {
   3997 namespace ento {
   3998 namespace objc_retain {
   3999 
   4000 // This is a bit gross, but it allows us to populate CallEffects without
   4001 // creating a bunch of accessors.  This kind is very localized, so the
   4002 // damage of this macro is limited.
   4003 #define createCallEffect(D, KIND)\
   4004   ASTContext &Ctx = D->getASTContext();\
   4005   LangOptions L = Ctx.getLangOpts();\
   4006   RetainSummaryManager M(Ctx, L.GCOnly, L.ObjCAutoRefCount);\
   4007   const RetainSummary *S = M.get ## KIND ## Summary(D);\
   4008   CallEffects CE(S->getRetEffect());\
   4009   CE.Receiver = S->getReceiverEffect();\
   4010   unsigned N = D->param_size();\
   4011   for (unsigned i = 0; i < N; ++i) {\
   4012     CE.Args.push_back(S->getArg(i));\
   4013   }
   4014 
   4015 CallEffects CallEffects::getEffect(const ObjCMethodDecl *MD) {
   4016   createCallEffect(MD, Method);
   4017   return CE;
   4018 }
   4019 
   4020 CallEffects CallEffects::getEffect(const FunctionDecl *FD) {
   4021   createCallEffect(FD, Function);
   4022   return CE;
   4023 }
   4024 
   4025 #undef createCallEffect
   4026 
   4027 } // end namespace objc_retain
   4028 } // end namespace ento
   4029 } // end namespace clang
   4030