14f7df9beSJordan Rose //===- Calls.cpp - Wrapper for all function and method calls ------*- C++ -*--//
24f7df9beSJordan Rose //
34f7df9beSJordan Rose //                     The LLVM Compiler Infrastructure
44f7df9beSJordan Rose //
54f7df9beSJordan Rose // This file is distributed under the University of Illinois Open Source
64f7df9beSJordan Rose // License. See LICENSE.TXT for details.
74f7df9beSJordan Rose //
84f7df9beSJordan Rose //===----------------------------------------------------------------------===//
94f7df9beSJordan Rose //
104f7df9beSJordan Rose /// \file This file defines CallEvent and its subclasses, which represent path-
114f7df9beSJordan Rose /// sensitive instances of different kinds of function and method calls
124f7df9beSJordan Rose /// (C, C++, and Objective-C).
134f7df9beSJordan Rose //
144f7df9beSJordan Rose //===----------------------------------------------------------------------===//
154f7df9beSJordan Rose 
164f7df9beSJordan Rose #include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h"
174f7df9beSJordan Rose #include "clang/AST/ParentMap.h"
183a02247dSChandler Carruth #include "clang/Analysis/ProgramPoint.h"
193a02247dSChandler Carruth #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
204f7df9beSJordan Rose #include "llvm/ADT/SmallSet.h"
214f7df9beSJordan Rose #include "llvm/ADT/StringExtras.h"
22444a1304SBenjamin Kramer #include "llvm/Support/raw_ostream.h"
234f7df9beSJordan Rose 
244f7df9beSJordan Rose using namespace clang;
254f7df9beSJordan Rose using namespace ento;
264f7df9beSJordan Rose 
274f7df9beSJordan Rose QualType CallEvent::getResultType() const {
282da56438SJordan Rose   const Expr *E = getOriginExpr();
292da56438SJordan Rose   assert(E && "Calls without origin expressions do not have results");
302da56438SJordan Rose   QualType ResultTy = E->getType();
314f7df9beSJordan Rose 
322da56438SJordan Rose   ASTContext &Ctx = getState()->getStateManager().getContext();
332da56438SJordan Rose 
342da56438SJordan Rose   // A function that returns a reference to 'int' will have a result type
352da56438SJordan Rose   // of simply 'int'. Check the origin expr's value kind to recover the
362da56438SJordan Rose   // proper type.
372da56438SJordan Rose   switch (E->getValueKind()) {
382da56438SJordan Rose   case VK_LValue:
392da56438SJordan Rose     ResultTy = Ctx.getLValueReferenceType(ResultTy);
402da56438SJordan Rose     break;
412da56438SJordan Rose   case VK_XValue:
422da56438SJordan Rose     ResultTy = Ctx.getRValueReferenceType(ResultTy);
432da56438SJordan Rose     break;
442da56438SJordan Rose   case VK_RValue:
452da56438SJordan Rose     // No adjustment is necessary.
462da56438SJordan Rose     break;
472da56438SJordan Rose   }
484f7df9beSJordan Rose 
494f7df9beSJordan Rose   return ResultTy;
504f7df9beSJordan Rose }
514f7df9beSJordan Rose 
524f7df9beSJordan Rose static bool isCallbackArg(SVal V, QualType T) {
534f7df9beSJordan Rose   // If the parameter is 0, it's harmless.
544f7df9beSJordan Rose   if (V.isZeroConstant())
554f7df9beSJordan Rose     return false;
564f7df9beSJordan Rose 
574f7df9beSJordan Rose   // If a parameter is a block or a callback, assume it can modify pointer.
584f7df9beSJordan Rose   if (T->isBlockPointerType() ||
594f7df9beSJordan Rose       T->isFunctionPointerType() ||
604f7df9beSJordan Rose       T->isObjCSelType())
614f7df9beSJordan Rose     return true;
624f7df9beSJordan Rose 
634f7df9beSJordan Rose   // Check if a callback is passed inside a struct (for both, struct passed by
644f7df9beSJordan Rose   // reference and by value). Dig just one level into the struct for now.
654f7df9beSJordan Rose 
66d1a08b6eSJordan Rose   if (T->isAnyPointerType() || T->isReferenceType())
674f7df9beSJordan Rose     T = T->getPointeeType();
684f7df9beSJordan Rose 
694f7df9beSJordan Rose   if (const RecordType *RT = T->getAsStructureType()) {
704f7df9beSJordan Rose     const RecordDecl *RD = RT->getDecl();
71e8a8baefSAaron Ballman     for (const auto *I : RD->fields()) {
724f7df9beSJordan Rose       QualType FieldT = I->getType();
734f7df9beSJordan Rose       if (FieldT->isBlockPointerType() || FieldT->isFunctionPointerType())
744f7df9beSJordan Rose         return true;
754f7df9beSJordan Rose     }
764f7df9beSJordan Rose   }
774f7df9beSJordan Rose 
784f7df9beSJordan Rose   return false;
794f7df9beSJordan Rose }
804f7df9beSJordan Rose 
814f7df9beSJordan Rose bool CallEvent::hasNonZeroCallbackArg() const {
824f7df9beSJordan Rose   unsigned NumOfArgs = getNumArgs();
834f7df9beSJordan Rose 
844f7df9beSJordan Rose   // If calling using a function pointer, assume the function does not
854f7df9beSJordan Rose   // have a callback. TODO: We could check the types of the arguments here.
864f7df9beSJordan Rose   if (!getDecl())
874f7df9beSJordan Rose     return false;
884f7df9beSJordan Rose 
894f7df9beSJordan Rose   unsigned Idx = 0;
904f7df9beSJordan Rose   for (CallEvent::param_type_iterator I = param_type_begin(),
914f7df9beSJordan Rose                                        E = param_type_end();
924f7df9beSJordan Rose        I != E && Idx < NumOfArgs; ++I, ++Idx) {
934f7df9beSJordan Rose     if (NumOfArgs <= Idx)
944f7df9beSJordan Rose       break;
954f7df9beSJordan Rose 
964f7df9beSJordan Rose     if (isCallbackArg(getArgSVal(Idx), *I))
974f7df9beSJordan Rose       return true;
984f7df9beSJordan Rose   }
994f7df9beSJordan Rose 
1004f7df9beSJordan Rose   return false;
1014f7df9beSJordan Rose }
1024f7df9beSJordan Rose 
103829c3831SJordan Rose bool CallEvent::isGlobalCFunction(StringRef FunctionName) const {
104829c3831SJordan Rose   const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(getDecl());
105829c3831SJordan Rose   if (!FD)
106829c3831SJordan Rose     return false;
107829c3831SJordan Rose 
108829c3831SJordan Rose   return CheckerContext::isCLibraryFunction(FD, FunctionName);
109829c3831SJordan Rose }
110829c3831SJordan Rose 
1114f7df9beSJordan Rose /// \brief Returns true if a type is a pointer-to-const or reference-to-const
1124f7df9beSJordan Rose /// with no further indirection.
1134f7df9beSJordan Rose static bool isPointerToConst(QualType Ty) {
1144f7df9beSJordan Rose   QualType PointeeTy = Ty->getPointeeType();
1154f7df9beSJordan Rose   if (PointeeTy == QualType())
1164f7df9beSJordan Rose     return false;
1174f7df9beSJordan Rose   if (!PointeeTy.isConstQualified())
1184f7df9beSJordan Rose     return false;
1194f7df9beSJordan Rose   if (PointeeTy->isAnyPointerType())
1204f7df9beSJordan Rose     return false;
1214f7df9beSJordan Rose   return true;
1224f7df9beSJordan Rose }
1234f7df9beSJordan Rose 
1244f7df9beSJordan Rose // Try to retrieve the function declaration and find the function parameter
1254f7df9beSJordan Rose // types which are pointers/references to a non-pointer const.
1264f7df9beSJordan Rose // We will not invalidate the corresponding argument regions.
1275413aaa7SJordan Rose static void findPtrToConstParams(llvm::SmallSet<unsigned, 4> &PreserveArgs,
1284f7df9beSJordan Rose                                  const CallEvent &Call) {
1294f7df9beSJordan Rose   unsigned Idx = 0;
1304f7df9beSJordan Rose   for (CallEvent::param_type_iterator I = Call.param_type_begin(),
1314f7df9beSJordan Rose                                       E = Call.param_type_end();
1324f7df9beSJordan Rose        I != E; ++I, ++Idx) {
1334f7df9beSJordan Rose     if (isPointerToConst(*I))
1344f7df9beSJordan Rose       PreserveArgs.insert(Idx);
1354f7df9beSJordan Rose   }
1364f7df9beSJordan Rose }
1374f7df9beSJordan Rose 
1384f7df9beSJordan Rose ProgramStateRef CallEvent::invalidateRegions(unsigned BlockCount,
1394f7df9beSJordan Rose                                              ProgramStateRef Orig) const {
1404f7df9beSJordan Rose   ProgramStateRef Result = (Orig ? Orig : getState());
1414f7df9beSJordan Rose 
1422741654bSJordan Rose   // Don't invalidate anything if the callee is marked pure/const.
1432741654bSJordan Rose   if (const Decl *callee = getDecl())
1442741654bSJordan Rose     if (callee->hasAttr<PureAttr>() || callee->hasAttr<ConstAttr>())
1452741654bSJordan Rose       return Result;
1462741654bSJordan Rose 
14760bf5f45SAnna Zaks   SmallVector<SVal, 8> ValuesToInvalidate;
148424ad95fSAnton Yartsev   RegionAndSymbolInvalidationTraits ETraits;
14960bf5f45SAnna Zaks 
15060bf5f45SAnna Zaks   getExtraInvalidatedValues(ValuesToInvalidate);
1514f7df9beSJordan Rose 
1524f7df9beSJordan Rose   // Indexes of arguments whose values will be preserved by the call.
1535413aaa7SJordan Rose   llvm::SmallSet<unsigned, 4> PreserveArgs;
1544f7df9beSJordan Rose   if (!argumentsMayEscape())
1554f7df9beSJordan Rose     findPtrToConstParams(PreserveArgs, *this);
1564f7df9beSJordan Rose 
1574f7df9beSJordan Rose   for (unsigned Idx = 0, Count = getNumArgs(); Idx != Count; ++Idx) {
1584f7df9beSJordan Rose     // Mark this region for invalidation.  We batch invalidate regions
1594f7df9beSJordan Rose     // below for efficiency.
1605413aaa7SJordan Rose     if (PreserveArgs.count(Idx))
161424ad95fSAnton Yartsev       if (const MemRegion *MR = getArgSVal(Idx).getAsRegion())
162424ad95fSAnton Yartsev         ETraits.setTrait(MR->StripCasts(),
163424ad95fSAnton Yartsev                         RegionAndSymbolInvalidationTraits::TK_PreserveContents);
164424ad95fSAnton Yartsev         // TODO: Factor this out + handle the lower level const pointers.
165424ad95fSAnton Yartsev 
16660bf5f45SAnna Zaks     ValuesToInvalidate.push_back(getArgSVal(Idx));
1674f7df9beSJordan Rose   }
1684f7df9beSJordan Rose 
1694f7df9beSJordan Rose   // Invalidate designated regions using the batch invalidation API.
1704f7df9beSJordan Rose   // NOTE: Even if RegionsToInvalidate is empty, we may still invalidate
1714f7df9beSJordan Rose   //  global variables.
17260bf5f45SAnna Zaks   return Result->invalidateRegions(ValuesToInvalidate, getOriginExpr(),
1734f7df9beSJordan Rose                                    BlockCount, getLocationContext(),
1749747febbSAnna Zaks                                    /*CausedByPointerEscape*/ true,
1750dbb783cSCraig Topper                                    /*Symbols=*/nullptr, this, &ETraits);
1764f7df9beSJordan Rose }
1774f7df9beSJordan Rose 
1784f7df9beSJordan Rose ProgramPoint CallEvent::getProgramPoint(bool IsPreVisit,
1794f7df9beSJordan Rose                                         const ProgramPointTag *Tag) const {
1804f7df9beSJordan Rose   if (const Expr *E = getOriginExpr()) {
1814f7df9beSJordan Rose     if (IsPreVisit)
1824f7df9beSJordan Rose       return PreStmt(E, getLocationContext(), Tag);
1834f7df9beSJordan Rose     return PostStmt(E, getLocationContext(), Tag);
1844f7df9beSJordan Rose   }
1854f7df9beSJordan Rose 
1864f7df9beSJordan Rose   const Decl *D = getDecl();
1874f7df9beSJordan Rose   assert(D && "Cannot get a program point without a statement or decl");
1884f7df9beSJordan Rose 
1894f7df9beSJordan Rose   SourceLocation Loc = getSourceRange().getBegin();
1904f7df9beSJordan Rose   if (IsPreVisit)
1914f7df9beSJordan Rose     return PreImplicitCall(D, Loc, getLocationContext(), Tag);
1924f7df9beSJordan Rose   return PostImplicitCall(D, Loc, getLocationContext(), Tag);
1934f7df9beSJordan Rose }
1944f7df9beSJordan Rose 
19572ce8e2dSJordan Rose SVal CallEvent::getArgSVal(unsigned Index) const {
19672ce8e2dSJordan Rose   const Expr *ArgE = getArgExpr(Index);
19772ce8e2dSJordan Rose   if (!ArgE)
19872ce8e2dSJordan Rose     return UnknownVal();
19972ce8e2dSJordan Rose   return getSVal(ArgE);
20072ce8e2dSJordan Rose }
20172ce8e2dSJordan Rose 
20272ce8e2dSJordan Rose SourceRange CallEvent::getArgSourceRange(unsigned Index) const {
20372ce8e2dSJordan Rose   const Expr *ArgE = getArgExpr(Index);
20472ce8e2dSJordan Rose   if (!ArgE)
20572ce8e2dSJordan Rose     return SourceRange();
20672ce8e2dSJordan Rose   return ArgE->getSourceRange();
20772ce8e2dSJordan Rose }
20872ce8e2dSJordan Rose 
209829c3831SJordan Rose SVal CallEvent::getReturnValue() const {
210829c3831SJordan Rose   const Expr *E = getOriginExpr();
211829c3831SJordan Rose   if (!E)
212829c3831SJordan Rose     return UndefinedVal();
213829c3831SJordan Rose   return getSVal(E);
214829c3831SJordan Rose }
215829c3831SJordan Rose 
216ef6b007dSAlp Toker LLVM_DUMP_METHOD void CallEvent::dump() const { dump(llvm::errs()); }
2179299d8c2SBenjamin Kramer 
21872ce8e2dSJordan Rose void CallEvent::dump(raw_ostream &Out) const {
21972ce8e2dSJordan Rose   ASTContext &Ctx = getState()->getStateManager().getContext();
22072ce8e2dSJordan Rose   if (const Expr *E = getOriginExpr()) {
2210dbb783cSCraig Topper     E->printPretty(Out, nullptr, Ctx.getPrintingPolicy());
22272ce8e2dSJordan Rose     Out << "\n";
22372ce8e2dSJordan Rose     return;
22472ce8e2dSJordan Rose   }
22572ce8e2dSJordan Rose 
22672ce8e2dSJordan Rose   if (const Decl *D = getDecl()) {
22772ce8e2dSJordan Rose     Out << "Call to ";
22872ce8e2dSJordan Rose     D->print(Out, Ctx.getPrintingPolicy());
22972ce8e2dSJordan Rose     return;
23072ce8e2dSJordan Rose   }
23172ce8e2dSJordan Rose 
23272ce8e2dSJordan Rose   // FIXME: a string representation of the kind would be nice.
23372ce8e2dSJordan Rose   Out << "Unknown call (type " << getKind() << ")";
23472ce8e2dSJordan Rose }
23572ce8e2dSJordan Rose 
2364f7df9beSJordan Rose 
237e537cc05SJordan Rose bool CallEvent::isCallStmt(const Stmt *S) {
23872ce8e2dSJordan Rose   return isa<CallExpr>(S) || isa<ObjCMessageExpr>(S)
239e537cc05SJordan Rose                           || isa<CXXConstructExpr>(S)
240e537cc05SJordan Rose                           || isa<CXXNewExpr>(S);
2414f7df9beSJordan Rose }
2424f7df9beSJordan Rose 
2435d2964e7SAnna Zaks QualType CallEvent::getDeclaredResultType(const Decl *D) {
2445d2964e7SAnna Zaks   assert(D);
2455d2964e7SAnna Zaks   if (const FunctionDecl* FD = dyn_cast<FunctionDecl>(D))
246314cc81bSAlp Toker     return FD->getReturnType();
247add14263SJordan Rose   if (const ObjCMethodDecl* MD = dyn_cast<ObjCMethodDecl>(D))
248314cc81bSAlp Toker     return MD->getReturnType();
249add14263SJordan Rose   if (const BlockDecl *BD = dyn_cast<BlockDecl>(D)) {
250add14263SJordan Rose     // Blocks are difficult because the return type may not be stored in the
251add14263SJordan Rose     // BlockDecl itself. The AST should probably be enhanced, but for now we
252add14263SJordan Rose     // just do what we can.
253278d9de3SJordan Rose     // If the block is declared without an explicit argument list, the
254278d9de3SJordan Rose     // signature-as-written just includes the return type, not the entire
255278d9de3SJordan Rose     // function type.
2561bfe9c78SJordan Rose     // FIXME: All blocks should have signatures-as-written, even if the return
257278d9de3SJordan Rose     // type is inferred. (That's signified with a dependent result type.)
2581bfe9c78SJordan Rose     if (const TypeSourceInfo *TSI = BD->getSignatureAsWritten()) {
259278d9de3SJordan Rose       QualType Ty = TSI->getType();
260278d9de3SJordan Rose       if (const FunctionType *FT = Ty->getAs<FunctionType>())
261314cc81bSAlp Toker         Ty = FT->getReturnType();
262278d9de3SJordan Rose       if (!Ty->isDependentType())
263278d9de3SJordan Rose         return Ty;
2641bfe9c78SJordan Rose     }
265add14263SJordan Rose 
266add14263SJordan Rose     return QualType();
267add14263SJordan Rose   }
268add14263SJordan Rose 
2693553bb38SJordan Rose   llvm_unreachable("unknown callable kind");
2703553bb38SJordan Rose }
2713553bb38SJordan Rose 
2723553bb38SJordan Rose bool CallEvent::isVariadic(const Decl *D) {
2733553bb38SJordan Rose   assert(D);
2743553bb38SJordan Rose 
2753553bb38SJordan Rose   if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
2763553bb38SJordan Rose     return FD->isVariadic();
2773553bb38SJordan Rose   if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
2783553bb38SJordan Rose     return MD->isVariadic();
2793553bb38SJordan Rose   if (const BlockDecl *BD = dyn_cast<BlockDecl>(D))
2803553bb38SJordan Rose     return BD->isVariadic();
2813553bb38SJordan Rose 
2823553bb38SJordan Rose   llvm_unreachable("unknown callable kind");
2835d2964e7SAnna Zaks }
2845d2964e7SAnna Zaks 
28542e8d649SJordan Rose static void addParameterValuesToBindings(const StackFrameContext *CalleeCtx,
28642e8d649SJordan Rose                                          CallEvent::BindingsTy &Bindings,
28742e8d649SJordan Rose                                          SValBuilder &SVB,
28842e8d649SJordan Rose                                          const CallEvent &Call,
2892ff16004STed Kremenek                                          ArrayRef<ParmVarDecl*> parameters) {
29042e8d649SJordan Rose   MemRegionManager &MRMgr = SVB.getRegionManager();
2914f7df9beSJordan Rose 
292963f91b3SPavel Labath   // If the function has fewer parameters than the call has arguments, we simply
293963f91b3SPavel Labath   // do not bind any values to them.
294963f91b3SPavel Labath   unsigned NumArgs = Call.getNumArgs();
29542e8d649SJordan Rose   unsigned Idx = 0;
2962ff16004STed Kremenek   ArrayRef<ParmVarDecl*>::iterator I = parameters.begin(), E = parameters.end();
297963f91b3SPavel Labath   for (; I != E && Idx < NumArgs; ++I, ++Idx) {
29842e8d649SJordan Rose     const ParmVarDecl *ParamDecl = *I;
29942e8d649SJordan Rose     assert(ParamDecl && "Formal parameter has no decl?");
3004f7df9beSJordan Rose 
30142e8d649SJordan Rose     SVal ArgVal = Call.getArgSVal(Idx);
30242e8d649SJordan Rose     if (!ArgVal.isUnknown()) {
30342e8d649SJordan Rose       Loc ParamLoc = SVB.makeLoc(MRMgr.getVarRegion(ParamDecl, CalleeCtx));
30442e8d649SJordan Rose       Bindings.push_back(std::make_pair(ParamLoc, ArgVal));
30542e8d649SJordan Rose     }
3064f7df9beSJordan Rose   }
3074f7df9beSJordan Rose 
30842e8d649SJordan Rose   // FIXME: Variadic arguments are not handled at all right now.
30942e8d649SJordan Rose }
31042e8d649SJordan Rose 
3112ff16004STed Kremenek ArrayRef<ParmVarDecl*> AnyFunctionCall::parameters() const {
31242e8d649SJordan Rose   const FunctionDecl *D = getDecl();
3134f7df9beSJordan Rose   if (!D)
31400bbdcf9SCraig Topper     return None;
3152ff16004STed Kremenek   return D->parameters();
31642e8d649SJordan Rose }
31742e8d649SJordan Rose 
31842e8d649SJordan Rose void AnyFunctionCall::getInitialStackFrameContents(
31942e8d649SJordan Rose                                         const StackFrameContext *CalleeCtx,
32042e8d649SJordan Rose                                         BindingsTy &Bindings) const {
32142e8d649SJordan Rose   const FunctionDecl *D = cast<FunctionDecl>(CalleeCtx->getDecl());
32242e8d649SJordan Rose   SValBuilder &SVB = getState()->getStateManager().getSValBuilder();
32342e8d649SJordan Rose   addParameterValuesToBindings(CalleeCtx, Bindings, SVB, *this,
3242ff16004STed Kremenek                                D->parameters());
3254f7df9beSJordan Rose }
3264f7df9beSJordan Rose 
3274f7df9beSJordan Rose bool AnyFunctionCall::argumentsMayEscape() const {
3284f7df9beSJordan Rose   if (hasNonZeroCallbackArg())
3294f7df9beSJordan Rose     return true;
3304f7df9beSJordan Rose 
3314f7df9beSJordan Rose   const FunctionDecl *D = getDecl();
3324f7df9beSJordan Rose   if (!D)
3334f7df9beSJordan Rose     return true;
3344f7df9beSJordan Rose 
3354f7df9beSJordan Rose   const IdentifierInfo *II = D->getIdentifier();
3364f7df9beSJordan Rose   if (!II)
3377bd0674dSAnna Zaks     return false;
3384f7df9beSJordan Rose 
3394f7df9beSJordan Rose   // This set of "escaping" APIs is
3404f7df9beSJordan Rose 
3414f7df9beSJordan Rose   // - 'int pthread_setspecific(ptheread_key k, const void *)' stores a
3424f7df9beSJordan Rose   //   value into thread local storage. The value can later be retrieved with
3434f7df9beSJordan Rose   //   'void *ptheread_getspecific(pthread_key)'. So even thought the
3444f7df9beSJordan Rose   //   parameter is 'const void *', the region escapes through the call.
3454f7df9beSJordan Rose   if (II->isStr("pthread_setspecific"))
3464f7df9beSJordan Rose     return true;
3474f7df9beSJordan Rose 
3484f7df9beSJordan Rose   // - xpc_connection_set_context stores a value which can be retrieved later
3494f7df9beSJordan Rose   //   with xpc_connection_get_context.
3504f7df9beSJordan Rose   if (II->isStr("xpc_connection_set_context"))
3514f7df9beSJordan Rose     return true;
3524f7df9beSJordan Rose 
3534f7df9beSJordan Rose   // - funopen - sets a buffer for future IO calls.
3544f7df9beSJordan Rose   if (II->isStr("funopen"))
3554f7df9beSJordan Rose     return true;
3564f7df9beSJordan Rose 
3574f7df9beSJordan Rose   StringRef FName = II->getName();
3584f7df9beSJordan Rose 
3594f7df9beSJordan Rose   // - CoreFoundation functions that end with "NoCopy" can free a passed-in
3604f7df9beSJordan Rose   //   buffer even if it is const.
3614f7df9beSJordan Rose   if (FName.endswith("NoCopy"))
3624f7df9beSJordan Rose     return true;
3634f7df9beSJordan Rose 
3644f7df9beSJordan Rose   // - NSXXInsertXX, for example NSMapInsertIfAbsent, since they can
3654f7df9beSJordan Rose   //   be deallocated by NSMapRemove.
3664f7df9beSJordan Rose   if (FName.startswith("NS") && (FName.find("Insert") != StringRef::npos))
3674f7df9beSJordan Rose     return true;
3684f7df9beSJordan Rose 
3694f7df9beSJordan Rose   // - Many CF containers allow objects to escape through custom
3704f7df9beSJordan Rose   //   allocators/deallocators upon container construction. (PR12101)
3714f7df9beSJordan Rose   if (FName.startswith("CF") || FName.startswith("CG")) {
3724f7df9beSJordan Rose     return StrInStrNoCase(FName, "InsertValue")  != StringRef::npos ||
3734f7df9beSJordan Rose            StrInStrNoCase(FName, "AddValue")     != StringRef::npos ||
3744f7df9beSJordan Rose            StrInStrNoCase(FName, "SetValue")     != StringRef::npos ||
3754f7df9beSJordan Rose            StrInStrNoCase(FName, "WithData")     != StringRef::npos ||
3764f7df9beSJordan Rose            StrInStrNoCase(FName, "AppendValue")  != StringRef::npos ||
3774f7df9beSJordan Rose            StrInStrNoCase(FName, "SetAttribute") != StringRef::npos;
3784f7df9beSJordan Rose   }
3794f7df9beSJordan Rose 
3804f7df9beSJordan Rose   return false;
3814f7df9beSJordan Rose }
3824f7df9beSJordan Rose 
3834f7df9beSJordan Rose 
3842a833ca5SJordan Rose const FunctionDecl *SimpleFunctionCall::getDecl() const {
3854f7df9beSJordan Rose   const FunctionDecl *D = getOriginExpr()->getDirectCallee();
3864f7df9beSJordan Rose   if (D)
3874f7df9beSJordan Rose     return D;
3884f7df9beSJordan Rose 
3894f7df9beSJordan Rose   return getSVal(getOriginExpr()->getCallee()).getAsFunctionDecl();
3904f7df9beSJordan Rose }
3914f7df9beSJordan Rose 
3924f7df9beSJordan Rose 
393ce6c99a5SJordan Rose const FunctionDecl *CXXInstanceCall::getDecl() const {
394ce6c99a5SJordan Rose   const CallExpr *CE = cast_or_null<CallExpr>(getOriginExpr());
395ce6c99a5SJordan Rose   if (!CE)
396ce6c99a5SJordan Rose     return AnyFunctionCall::getDecl();
397ce6c99a5SJordan Rose 
398ce6c99a5SJordan Rose   const FunctionDecl *D = CE->getDirectCallee();
399ce6c99a5SJordan Rose   if (D)
400ce6c99a5SJordan Rose     return D;
401ce6c99a5SJordan Rose 
402ce6c99a5SJordan Rose   return getSVal(CE->getCallee()).getAsFunctionDecl();
403ce6c99a5SJordan Rose }
404ce6c99a5SJordan Rose 
40560bf5f45SAnna Zaks void CXXInstanceCall::getExtraInvalidatedValues(ValueList &Values) const {
40660bf5f45SAnna Zaks   Values.push_back(getCXXThisVal());
4074f7df9beSJordan Rose }
4084f7df9beSJordan Rose 
409fcdda361SJordan Rose SVal CXXInstanceCall::getCXXThisVal() const {
410fcdda361SJordan Rose   const Expr *Base = getCXXThisExpr();
411fcdda361SJordan Rose   // FIXME: This doesn't handle an overloaded ->* operator.
412fcdda361SJordan Rose   if (!Base)
413fcdda361SJordan Rose     return UnknownVal();
414fcdda361SJordan Rose 
415fcdda361SJordan Rose   SVal ThisVal = getSVal(Base);
4162fdacbc5SDavid Blaikie   assert(ThisVal.isUnknownOrUndef() || ThisVal.getAs<Loc>());
417fcdda361SJordan Rose   return ThisVal;
418fcdda361SJordan Rose }
419fcdda361SJordan Rose 
4204f7df9beSJordan Rose 
421089c5510STed Kremenek RuntimeDefinition CXXInstanceCall::getRuntimeDefinition() const {
4220f6d63beSJordan Rose   // Do we have a decl at all?
42351bcb226SJordan Rose   const Decl *D = getDecl();
4244f7df9beSJordan Rose   if (!D)
425123af098SAnna Zaks     return RuntimeDefinition();
4264f7df9beSJordan Rose 
4270f6d63beSJordan Rose   // If the method is non-virtual, we know we can inline it.
4284f7df9beSJordan Rose   const CXXMethodDecl *MD = cast<CXXMethodDecl>(D);
4294f7df9beSJordan Rose   if (!MD->isVirtual())
430089c5510STed Kremenek     return AnyFunctionCall::getRuntimeDefinition();
4314f7df9beSJordan Rose 
4320f6d63beSJordan Rose   // Do we know the implicit 'this' object being called?
4330f6d63beSJordan Rose   const MemRegion *R = getCXXThisVal().getAsRegion();
4340f6d63beSJordan Rose   if (!R)
435123af098SAnna Zaks     return RuntimeDefinition();
4360f6d63beSJordan Rose 
4370f6d63beSJordan Rose   // Do we know anything about the type of 'this'?
4380f6d63beSJordan Rose   DynamicTypeInfo DynType = getState()->getDynamicTypeInfo(R);
4390f6d63beSJordan Rose   if (!DynType.isValid())
4400f6d63beSJordan Rose     return RuntimeDefinition();
4410f6d63beSJordan Rose 
4420f6d63beSJordan Rose   // Is the type a C++ class? (This is mostly a defensive check.)
4430f6d63beSJordan Rose   QualType RegionType = DynType.getType()->getPointeeType();
444d1a08b6eSJordan Rose   assert(!RegionType.isNull() && "DynamicTypeInfo should always be a pointer.");
445d1a08b6eSJordan Rose 
4460f6d63beSJordan Rose   const CXXRecordDecl *RD = RegionType->getAsCXXRecordDecl();
44799107208SJordan Rose   if (!RD || !RD->hasDefinition())
4480f6d63beSJordan Rose     return RuntimeDefinition();
4490f6d63beSJordan Rose 
45099c6c2b4SJordan Rose   // Find the decl for this method in that class.
45199c6c2b4SJordan Rose   const CXXMethodDecl *Result = MD->getCorrespondingMethodInClass(RD, true);
45281456d9fSJordan Rose   if (!Result) {
45381456d9fSJordan Rose     // We might not even get the original statically-resolved method due to
45481456d9fSJordan Rose     // some particularly nasty casting (e.g. casts to sister classes).
45581456d9fSJordan Rose     // However, we should at least be able to search up and down our own class
45681456d9fSJordan Rose     // hierarchy, and some real bugs have been caught by checking this.
45781456d9fSJordan Rose     assert(!RD->isDerivedFrom(MD->getParent()) && "Couldn't find known method");
458d44977efSJordan Rose 
459d44977efSJordan Rose     // FIXME: This is checking that our DynamicTypeInfo is at least as good as
460d44977efSJordan Rose     // the static type. However, because we currently don't update
461d44977efSJordan Rose     // DynamicTypeInfo when an object is cast, we can't actually be sure the
462d44977efSJordan Rose     // DynamicTypeInfo is up to date. This assert should be re-enabled once
463d44977efSJordan Rose     // this is fixed. <rdar://problem/12287087>
464d44977efSJordan Rose     //assert(!MD->getParent()->isDerivedFrom(RD) && "Bad DynamicTypeInfo");
465d44977efSJordan Rose 
46681456d9fSJordan Rose     return RuntimeDefinition();
46781456d9fSJordan Rose   }
4680f6d63beSJordan Rose 
4690f6d63beSJordan Rose   // Does the decl that we found have an implementation?
4700f6d63beSJordan Rose   const FunctionDecl *Definition;
4710f6d63beSJordan Rose   if (!Result->hasBody(Definition))
4720f6d63beSJordan Rose     return RuntimeDefinition();
4730f6d63beSJordan Rose 
4740f6d63beSJordan Rose   // We found a definition. If we're not sure that this devirtualization is
4750f6d63beSJordan Rose   // actually what will happen at runtime, make sure to provide the region so
4760f6d63beSJordan Rose   // that ExprEngine can decide what to do with it.
4770f6d63beSJordan Rose   if (DynType.canBeASubClass())
4780f6d63beSJordan Rose     return RuntimeDefinition(Definition, R->StripCasts());
4790dbb783cSCraig Topper   return RuntimeDefinition(Definition, /*DispatchRegion=*/nullptr);
4804f7df9beSJordan Rose }
4814f7df9beSJordan Rose 
48242e8d649SJordan Rose void CXXInstanceCall::getInitialStackFrameContents(
48342e8d649SJordan Rose                                             const StackFrameContext *CalleeCtx,
48442e8d649SJordan Rose                                             BindingsTy &Bindings) const {
48542e8d649SJordan Rose   AnyFunctionCall::getInitialStackFrameContents(CalleeCtx, Bindings);
48642e8d649SJordan Rose 
48702e5309bSJordan Rose   // Handle the binding of 'this' in the new stack frame.
48842e8d649SJordan Rose   SVal ThisVal = getCXXThisVal();
48942e8d649SJordan Rose   if (!ThisVal.isUnknown()) {
49002e5309bSJordan Rose     ProgramStateManager &StateMgr = getState()->getStateManager();
49102e5309bSJordan Rose     SValBuilder &SVB = StateMgr.getSValBuilder();
49202e5309bSJordan Rose 
49342e8d649SJordan Rose     const CXXMethodDecl *MD = cast<CXXMethodDecl>(CalleeCtx->getDecl());
49442e8d649SJordan Rose     Loc ThisLoc = SVB.getCXXThis(MD, CalleeCtx);
49502e5309bSJordan Rose 
49631c3fa9cSJordan Rose     // If we devirtualized to a different member function, we need to make sure
49731c3fa9cSJordan Rose     // we have the proper layering of CXXBaseObjectRegions.
49831c3fa9cSJordan Rose     if (MD->getCanonicalDecl() != getDecl()->getCanonicalDecl()) {
499710f6b12SJordan Rose       ASTContext &Ctx = SVB.getContext();
50002e5309bSJordan Rose       const CXXRecordDecl *Class = MD->getParent();
501710f6b12SJordan Rose       QualType Ty = Ctx.getPointerType(Ctx.getRecordType(Class));
50202e5309bSJordan Rose 
503710f6b12SJordan Rose       // FIXME: CallEvent maybe shouldn't be directly accessing StoreManager.
504710f6b12SJordan Rose       bool Failed;
505710f6b12SJordan Rose       ThisVal = StateMgr.getStoreManager().evalDynamicCast(ThisVal, Ty, Failed);
506710f6b12SJordan Rose       assert(!Failed && "Calling an incorrectly devirtualized method");
50702e5309bSJordan Rose     }
50802e5309bSJordan Rose 
50931c3fa9cSJordan Rose     if (!ThisVal.isUnknown())
51042e8d649SJordan Rose       Bindings.push_back(std::make_pair(ThisLoc, ThisVal));
51142e8d649SJordan Rose   }
51242e8d649SJordan Rose }
51342e8d649SJordan Rose 
51442e8d649SJordan Rose 
5154f7df9beSJordan Rose 
51692e1449bSJordan Rose const Expr *CXXMemberCall::getCXXThisExpr() const {
51792e1449bSJordan Rose   return getOriginExpr()->getImplicitObjectArgument();
5184f7df9beSJordan Rose }
5194f7df9beSJordan Rose 
520089c5510STed Kremenek RuntimeDefinition CXXMemberCall::getRuntimeDefinition() const {
52112f669e3SJordan Rose   // C++11 [expr.call]p1: ...If the selected function is non-virtual, or if the
52212f669e3SJordan Rose   // id-expression in the class member access expression is a qualified-id,
52312f669e3SJordan Rose   // that function is called. Otherwise, its final overrider in the dynamic type
52412f669e3SJordan Rose   // of the object expression is called.
52512f669e3SJordan Rose   if (const MemberExpr *ME = dyn_cast<MemberExpr>(getOriginExpr()->getCallee()))
52612f669e3SJordan Rose     if (ME->hasQualifier())
527089c5510STed Kremenek       return AnyFunctionCall::getRuntimeDefinition();
52812f669e3SJordan Rose 
529089c5510STed Kremenek   return CXXInstanceCall::getRuntimeDefinition();
53012f669e3SJordan Rose }
53112f669e3SJordan Rose 
5324f7df9beSJordan Rose 
53392e1449bSJordan Rose const Expr *CXXMemberOperatorCall::getCXXThisExpr() const {
53492e1449bSJordan Rose   return getOriginExpr()->getArg(0);
5354f7df9beSJordan Rose }
5364f7df9beSJordan Rose 
5374f7df9beSJordan Rose 
5384f7df9beSJordan Rose const BlockDataRegion *BlockCall::getBlockRegion() const {
5394f7df9beSJordan Rose   const Expr *Callee = getOriginExpr()->getCallee();
5404f7df9beSJordan Rose   const MemRegion *DataReg = getSVal(Callee).getAsRegion();
5414f7df9beSJordan Rose 
5424f7df9beSJordan Rose   return dyn_cast_or_null<BlockDataRegion>(DataReg);
5434f7df9beSJordan Rose }
5444f7df9beSJordan Rose 
5452ff16004STed Kremenek ArrayRef<ParmVarDecl*> BlockCall::parameters() const {
5462a833ca5SJordan Rose   const BlockDecl *D = getDecl();
5474f7df9beSJordan Rose   if (!D)
5480dbb783cSCraig Topper     return nullptr;
5492ff16004STed Kremenek   return D->parameters();
5504f7df9beSJordan Rose }
5514f7df9beSJordan Rose 
55260bf5f45SAnna Zaks void BlockCall::getExtraInvalidatedValues(ValueList &Values) const {
5534f7df9beSJordan Rose   // FIXME: This also needs to invalidate captured globals.
5544f7df9beSJordan Rose   if (const MemRegion *R = getBlockRegion())
55560bf5f45SAnna Zaks     Values.push_back(loc::MemRegionVal(R));
5564f7df9beSJordan Rose }
5574f7df9beSJordan Rose 
55842e8d649SJordan Rose void BlockCall::getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
55942e8d649SJordan Rose                                              BindingsTy &Bindings) const {
56042e8d649SJordan Rose   const BlockDecl *D = cast<BlockDecl>(CalleeCtx->getDecl());
56142e8d649SJordan Rose   SValBuilder &SVB = getState()->getStateManager().getSValBuilder();
56242e8d649SJordan Rose   addParameterValuesToBindings(CalleeCtx, Bindings, SVB, *this,
5632ff16004STed Kremenek                                D->parameters());
56442e8d649SJordan Rose }
56542e8d649SJordan Rose 
56642e8d649SJordan Rose 
5674f7df9beSJordan Rose SVal CXXConstructorCall::getCXXThisVal() const {
5684f7df9beSJordan Rose   if (Data)
5694f7df9beSJordan Rose     return loc::MemRegionVal(static_cast<const MemRegion *>(Data));
5704f7df9beSJordan Rose   return UnknownVal();
5714f7df9beSJordan Rose }
5724f7df9beSJordan Rose 
57360bf5f45SAnna Zaks void CXXConstructorCall::getExtraInvalidatedValues(ValueList &Values) const {
5744f7df9beSJordan Rose   if (Data)
57560bf5f45SAnna Zaks     Values.push_back(loc::MemRegionVal(static_cast<const MemRegion *>(Data)));
5764f7df9beSJordan Rose }
5774f7df9beSJordan Rose 
57842e8d649SJordan Rose void CXXConstructorCall::getInitialStackFrameContents(
57942e8d649SJordan Rose                                              const StackFrameContext *CalleeCtx,
58042e8d649SJordan Rose                                              BindingsTy &Bindings) const {
58142e8d649SJordan Rose   AnyFunctionCall::getInitialStackFrameContents(CalleeCtx, Bindings);
58242e8d649SJordan Rose 
58342e8d649SJordan Rose   SVal ThisVal = getCXXThisVal();
58442e8d649SJordan Rose   if (!ThisVal.isUnknown()) {
58542e8d649SJordan Rose     SValBuilder &SVB = getState()->getStateManager().getSValBuilder();
58642e8d649SJordan Rose     const CXXMethodDecl *MD = cast<CXXMethodDecl>(CalleeCtx->getDecl());
58742e8d649SJordan Rose     Loc ThisLoc = SVB.getCXXThis(MD, CalleeCtx);
58842e8d649SJordan Rose     Bindings.push_back(std::make_pair(ThisLoc, ThisVal));
58942e8d649SJordan Rose   }
59042e8d649SJordan Rose }
59142e8d649SJordan Rose 
5924f7df9beSJordan Rose SVal CXXDestructorCall::getCXXThisVal() const {
5934f7df9beSJordan Rose   if (Data)
5942bc9674bSJordan Rose     return loc::MemRegionVal(DtorDataTy::getFromOpaqueValue(Data).getPointer());
5954f7df9beSJordan Rose   return UnknownVal();
5964f7df9beSJordan Rose }
5974f7df9beSJordan Rose 
598089c5510STed Kremenek RuntimeDefinition CXXDestructorCall::getRuntimeDefinition() const {
5992bc9674bSJordan Rose   // Base destructors are always called non-virtually.
6002bc9674bSJordan Rose   // Skip CXXInstanceCall's devirtualization logic in this case.
6012bc9674bSJordan Rose   if (isBaseDestructor())
602089c5510STed Kremenek     return AnyFunctionCall::getRuntimeDefinition();
6032bc9674bSJordan Rose 
604089c5510STed Kremenek   return CXXInstanceCall::getRuntimeDefinition();
6052bc9674bSJordan Rose }
6062bc9674bSJordan Rose 
6072ff16004STed Kremenek ArrayRef<ParmVarDecl*> ObjCMethodCall::parameters() const {
60842e8d649SJordan Rose   const ObjCMethodDecl *D = getDecl();
6094f7df9beSJordan Rose   if (!D)
6105fc8fc2dSCraig Topper     return None;
6112ff16004STed Kremenek   return D->parameters();
6124f7df9beSJordan Rose }
6134f7df9beSJordan Rose 
6144f7df9beSJordan Rose void
61560bf5f45SAnna Zaks ObjCMethodCall::getExtraInvalidatedValues(ValueList &Values) const {
61660bf5f45SAnna Zaks   Values.push_back(getReceiverSVal());
6174f7df9beSJordan Rose }
6184f7df9beSJordan Rose 
6193d5d3d3eSAnna Zaks SVal ObjCMethodCall::getSelfSVal() const {
6203d5d3d3eSAnna Zaks   const LocationContext *LCtx = getLocationContext();
6213d5d3d3eSAnna Zaks   const ImplicitParamDecl *SelfDecl = LCtx->getSelfDecl();
6223d5d3d3eSAnna Zaks   if (!SelfDecl)
6233d5d3d3eSAnna Zaks     return SVal();
6243d5d3d3eSAnna Zaks   return getState()->getSVal(getState()->getRegion(SelfDecl, LCtx));
6253d5d3d3eSAnna Zaks }
6263d5d3d3eSAnna Zaks 
6274f7df9beSJordan Rose SVal ObjCMethodCall::getReceiverSVal() const {
6284f7df9beSJordan Rose   // FIXME: Is this the best way to handle class receivers?
6294f7df9beSJordan Rose   if (!isInstanceMessage())
6304f7df9beSJordan Rose     return UnknownVal();
6314f7df9beSJordan Rose 
632472dbcf1SAnna Zaks   if (const Expr *RecE = getOriginExpr()->getInstanceReceiver())
633472dbcf1SAnna Zaks     return getSVal(RecE);
6344f7df9beSJordan Rose 
6354f7df9beSJordan Rose   // An instance message with no expression means we are sending to super.
6364f7df9beSJordan Rose   // In this case the object reference is the same as 'self'.
6373d5d3d3eSAnna Zaks   assert(getOriginExpr()->getReceiverKind() == ObjCMessageExpr::SuperInstance);
6383d5d3d3eSAnna Zaks   SVal SelfVal = getSelfSVal();
6393d5d3d3eSAnna Zaks   assert(SelfVal.isValid() && "Calling super but not in ObjC method");
6403d5d3d3eSAnna Zaks   return SelfVal;
6413d5d3d3eSAnna Zaks }
6423d5d3d3eSAnna Zaks 
6433d5d3d3eSAnna Zaks bool ObjCMethodCall::isReceiverSelfOrSuper() const {
6443d5d3d3eSAnna Zaks   if (getOriginExpr()->getReceiverKind() == ObjCMessageExpr::SuperInstance ||
6453d5d3d3eSAnna Zaks       getOriginExpr()->getReceiverKind() == ObjCMessageExpr::SuperClass)
6463d5d3d3eSAnna Zaks       return true;
6473d5d3d3eSAnna Zaks 
6483d5d3d3eSAnna Zaks   if (!isInstanceMessage())
6493d5d3d3eSAnna Zaks     return false;
6503d5d3d3eSAnna Zaks 
6513d5d3d3eSAnna Zaks   SVal RecVal = getSVal(getOriginExpr()->getInstanceReceiver());
6523d5d3d3eSAnna Zaks 
6533d5d3d3eSAnna Zaks   return (RecVal == getSelfSVal());
6544f7df9beSJordan Rose }
6554f7df9beSJordan Rose 
6564f7df9beSJordan Rose SourceRange ObjCMethodCall::getSourceRange() const {
6574f7df9beSJordan Rose   switch (getMessageKind()) {
6584f7df9beSJordan Rose   case OCM_Message:
6594f7df9beSJordan Rose     return getOriginExpr()->getSourceRange();
6604f7df9beSJordan Rose   case OCM_PropertyAccess:
6614f7df9beSJordan Rose   case OCM_Subscript:
6624f7df9beSJordan Rose     return getContainingPseudoObjectExpr()->getSourceRange();
6634f7df9beSJordan Rose   }
6644f7df9beSJordan Rose   llvm_unreachable("unknown message kind");
6654f7df9beSJordan Rose }
6664f7df9beSJordan Rose 
6674f7df9beSJordan Rose typedef llvm::PointerIntPair<const PseudoObjectExpr *, 2> ObjCMessageDataTy;
6684f7df9beSJordan Rose 
6694f7df9beSJordan Rose const PseudoObjectExpr *ObjCMethodCall::getContainingPseudoObjectExpr() const {
6700dbb783cSCraig Topper   assert(Data && "Lazy lookup not yet performed.");
6714f7df9beSJordan Rose   assert(getMessageKind() != OCM_Message && "Explicit message send.");
6724f7df9beSJordan Rose   return ObjCMessageDataTy::getFromOpaqueValue(Data).getPointer();
6734f7df9beSJordan Rose }
6744f7df9beSJordan Rose 
6754f7df9beSJordan Rose ObjCMessageKind ObjCMethodCall::getMessageKind() const {
6760dbb783cSCraig Topper   if (!Data) {
677226a56faSAnna Zaks 
678226a56faSAnna Zaks     // Find the parent, ignoring implicit casts.
6794f7df9beSJordan Rose     ParentMap &PM = getLocationContext()->getParentMap();
6805770c038SJordan Rose     const Stmt *S = PM.getParentIgnoreParenCasts(getOriginExpr());
681226a56faSAnna Zaks 
682226a56faSAnna Zaks     // Check if parent is a PseudoObjectExpr.
6834f7df9beSJordan Rose     if (const PseudoObjectExpr *POE = dyn_cast_or_null<PseudoObjectExpr>(S)) {
6844f7df9beSJordan Rose       const Expr *Syntactic = POE->getSyntacticForm();
6854f7df9beSJordan Rose 
6864f7df9beSJordan Rose       // This handles the funny case of assigning to the result of a getter.
6874f7df9beSJordan Rose       // This can happen if the getter returns a non-const reference.
6884f7df9beSJordan Rose       if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(Syntactic))
6894f7df9beSJordan Rose         Syntactic = BO->getLHS();
6904f7df9beSJordan Rose 
6914f7df9beSJordan Rose       ObjCMessageKind K;
6924f7df9beSJordan Rose       switch (Syntactic->getStmtClass()) {
6934f7df9beSJordan Rose       case Stmt::ObjCPropertyRefExprClass:
6944f7df9beSJordan Rose         K = OCM_PropertyAccess;
6954f7df9beSJordan Rose         break;
6964f7df9beSJordan Rose       case Stmt::ObjCSubscriptRefExprClass:
6974f7df9beSJordan Rose         K = OCM_Subscript;
6984f7df9beSJordan Rose         break;
6994f7df9beSJordan Rose       default:
7004f7df9beSJordan Rose         // FIXME: Can this ever happen?
7014f7df9beSJordan Rose         K = OCM_Message;
7024f7df9beSJordan Rose         break;
7034f7df9beSJordan Rose       }
7044f7df9beSJordan Rose 
7054f7df9beSJordan Rose       if (K != OCM_Message) {
7064f7df9beSJordan Rose         const_cast<ObjCMethodCall *>(this)->Data
7074f7df9beSJordan Rose           = ObjCMessageDataTy(POE, K).getOpaqueValue();
7084f7df9beSJordan Rose         assert(getMessageKind() == K);
7094f7df9beSJordan Rose         return K;
7104f7df9beSJordan Rose       }
7114f7df9beSJordan Rose     }
7124f7df9beSJordan Rose 
7134f7df9beSJordan Rose     const_cast<ObjCMethodCall *>(this)->Data
7140dbb783cSCraig Topper       = ObjCMessageDataTy(nullptr, 1).getOpaqueValue();
7154f7df9beSJordan Rose     assert(getMessageKind() == OCM_Message);
7164f7df9beSJordan Rose     return OCM_Message;
7174f7df9beSJordan Rose   }
7184f7df9beSJordan Rose 
7194f7df9beSJordan Rose   ObjCMessageDataTy Info = ObjCMessageDataTy::getFromOpaqueValue(Data);
7204f7df9beSJordan Rose   if (!Info.getPointer())
7214f7df9beSJordan Rose     return OCM_Message;
7224f7df9beSJordan Rose   return static_cast<ObjCMessageKind>(Info.getInt());
7234f7df9beSJordan Rose }
7244f7df9beSJordan Rose 
725920af014SAnna Zaks 
726920af014SAnna Zaks bool ObjCMethodCall::canBeOverridenInSubclass(ObjCInterfaceDecl *IDecl,
727920af014SAnna Zaks                                              Selector Sel) const {
728920af014SAnna Zaks   assert(IDecl);
729920af014SAnna Zaks   const SourceManager &SM =
730920af014SAnna Zaks     getState()->getStateManager().getContext().getSourceManager();
731920af014SAnna Zaks 
732920af014SAnna Zaks   // If the class interface is declared inside the main file, assume it is not
733920af014SAnna Zaks   // subcassed.
734920af014SAnna Zaks   // TODO: It could actually be subclassed if the subclass is private as well.
735920af014SAnna Zaks   // This is probably very rare.
736920af014SAnna Zaks   SourceLocation InterfLoc = IDecl->getEndOfDefinitionLoc();
7375ba37d52SEli Friedman   if (InterfLoc.isValid() && SM.isInMainFile(InterfLoc))
738920af014SAnna Zaks     return false;
739920af014SAnna Zaks 
7406ddb6b1aSAnna Zaks   // Assume that property accessors are not overridden.
7416ddb6b1aSAnna Zaks   if (getMessageKind() == OCM_PropertyAccess)
7426ddb6b1aSAnna Zaks     return false;
743920af014SAnna Zaks 
744920af014SAnna Zaks   // We assume that if the method is public (declared outside of main file) or
745920af014SAnna Zaks   // has a parent which publicly declares the method, the method could be
746920af014SAnna Zaks   // overridden in a subclass.
747920af014SAnna Zaks 
748920af014SAnna Zaks   // Find the first declaration in the class hierarchy that declares
749920af014SAnna Zaks   // the selector.
7500dbb783cSCraig Topper   ObjCMethodDecl *D = nullptr;
751920af014SAnna Zaks   while (true) {
752920af014SAnna Zaks     D = IDecl->lookupMethod(Sel, true);
753920af014SAnna Zaks 
754920af014SAnna Zaks     // Cannot find a public definition.
755920af014SAnna Zaks     if (!D)
756920af014SAnna Zaks       return false;
757920af014SAnna Zaks 
758920af014SAnna Zaks     // If outside the main file,
7595ba37d52SEli Friedman     if (D->getLocation().isValid() && !SM.isInMainFile(D->getLocation()))
760920af014SAnna Zaks       return true;
761920af014SAnna Zaks 
762920af014SAnna Zaks     if (D->isOverriding()) {
763920af014SAnna Zaks       // Search in the superclass on the next iteration.
764920af014SAnna Zaks       IDecl = D->getClassInterface();
765920af014SAnna Zaks       if (!IDecl)
766920af014SAnna Zaks         return false;
767920af014SAnna Zaks 
768920af014SAnna Zaks       IDecl = IDecl->getSuperClass();
769920af014SAnna Zaks       if (!IDecl)
770920af014SAnna Zaks         return false;
771920af014SAnna Zaks 
772920af014SAnna Zaks       continue;
773920af014SAnna Zaks     }
774920af014SAnna Zaks 
775920af014SAnna Zaks     return false;
776920af014SAnna Zaks   };
777920af014SAnna Zaks 
778920af014SAnna Zaks   llvm_unreachable("The while loop should always terminate.");
779920af014SAnna Zaks }
780920af014SAnna Zaks 
781089c5510STed Kremenek RuntimeDefinition ObjCMethodCall::getRuntimeDefinition() const {
78263282aefSAnna Zaks   const ObjCMessageExpr *E = getOriginExpr();
78363282aefSAnna Zaks   assert(E);
7845808eb80SAnna Zaks   Selector Sel = E->getSelector();
7854f7df9beSJordan Rose 
78663282aefSAnna Zaks   if (E->isInstanceMessage()) {
7875808eb80SAnna Zaks 
788*2c4555adSEric Christopher     // Find the receiver type.
7890dbb783cSCraig Topper     const ObjCObjectPointerType *ReceiverT = nullptr;
79075f49a9cSAnna Zaks     bool CanBeSubClassed = false;
7915808eb80SAnna Zaks     QualType SupersType = E->getSuperType();
7920dbb783cSCraig Topper     const MemRegion *Receiver = nullptr;
793123af098SAnna Zaks 
7945808eb80SAnna Zaks     if (!SupersType.isNull()) {
795123af098SAnna Zaks       // Super always means the type of immediate predecessor to the method
796123af098SAnna Zaks       // where the call occurs.
79775930b65SAnna Zaks       ReceiverT = cast<ObjCObjectPointerType>(SupersType);
7985808eb80SAnna Zaks     } else {
799123af098SAnna Zaks       Receiver = getReceiverSVal().getAsRegion();
8006a97d92eSJordan Rose       if (!Receiver)
801123af098SAnna Zaks         return RuntimeDefinition();
8026a97d92eSJordan Rose 
80375f49a9cSAnna Zaks       DynamicTypeInfo DTI = getState()->getDynamicTypeInfo(Receiver);
80475f49a9cSAnna Zaks       QualType DynType = DTI.getType();
80575f49a9cSAnna Zaks       CanBeSubClassed = DTI.canBeASubClass();
80675930b65SAnna Zaks       ReceiverT = dyn_cast<ObjCObjectPointerType>(DynType);
80775f49a9cSAnna Zaks 
80875f49a9cSAnna Zaks       if (ReceiverT && CanBeSubClassed)
80975f49a9cSAnna Zaks         if (ObjCInterfaceDecl *IDecl = ReceiverT->getInterfaceDecl())
81075f49a9cSAnna Zaks           if (!canBeOverridenInSubclass(IDecl, Sel))
81175f49a9cSAnna Zaks             CanBeSubClassed = false;
8124f7df9beSJordan Rose     }
8134f7df9beSJordan Rose 
8145808eb80SAnna Zaks     // Lookup the method implementation.
8155808eb80SAnna Zaks     if (ReceiverT)
816920af014SAnna Zaks       if (ObjCInterfaceDecl *IDecl = ReceiverT->getInterfaceDecl()) {
817245e45afSTed Kremenek         // Repeatedly calling lookupPrivateMethod() is expensive, especially
818245e45afSTed Kremenek         // when in many cases it returns null.  We cache the results so
819245e45afSTed Kremenek         // that repeated queries on the same ObjCIntefaceDecl and Selector
820245e45afSTed Kremenek         // don't incur the same cost.  On some test cases, we can see the
821245e45afSTed Kremenek         // same query being issued thousands of times.
822245e45afSTed Kremenek         //
823245e45afSTed Kremenek         // NOTE: This cache is essentially a "global" variable, but it
824245e45afSTed Kremenek         // only gets lazily created when we get here.  The value of the
825245e45afSTed Kremenek         // cache probably comes from it being global across ExprEngines,
826245e45afSTed Kremenek         // where the same queries may get issued.  If we are worried about
827245e45afSTed Kremenek         // concurrency, or possibly loading/unloading ASTs, etc., we may
828245e45afSTed Kremenek         // need to revisit this someday.  In terms of memory, this table
829245e45afSTed Kremenek         // stays around until clang quits, which also may be bad if we
830245e45afSTed Kremenek         // need to release memory.
831245e45afSTed Kremenek         typedef std::pair<const ObjCInterfaceDecl*, Selector>
832245e45afSTed Kremenek                 PrivateMethodKey;
833245e45afSTed Kremenek         typedef llvm::DenseMap<PrivateMethodKey,
83405785d16SDavid Blaikie                                Optional<const ObjCMethodDecl *> >
835245e45afSTed Kremenek                 PrivateMethodCache;
836245e45afSTed Kremenek 
837245e45afSTed Kremenek         static PrivateMethodCache PMC;
83805785d16SDavid Blaikie         Optional<const ObjCMethodDecl *> &Val = PMC[std::make_pair(IDecl, Sel)];
839245e45afSTed Kremenek 
840245e45afSTed Kremenek         // Query lookupPrivateMethod() if the cache does not hit.
8411a866cd5SJordan Rose         if (!Val.hasValue()) {
842245e45afSTed Kremenek           Val = IDecl->lookupPrivateMethod(Sel);
843245e45afSTed Kremenek 
8441a866cd5SJordan Rose           // If the method is a property accessor, we should try to "inline" it
8451a866cd5SJordan Rose           // even if we don't actually have an implementation.
8461a866cd5SJordan Rose           if (!*Val)
8471a866cd5SJordan Rose             if (const ObjCMethodDecl *CompileTimeMD = E->getMethodDecl())
8481a866cd5SJordan Rose               if (CompileTimeMD->isPropertyAccessor())
8491a866cd5SJordan Rose                 Val = IDecl->lookupInstanceMethod(Sel);
8501a866cd5SJordan Rose         }
8511a866cd5SJordan Rose 
852245e45afSTed Kremenek         const ObjCMethodDecl *MD = Val.getValue();
85375f49a9cSAnna Zaks         if (CanBeSubClassed)
85475f49a9cSAnna Zaks           return RuntimeDefinition(MD, Receiver);
855920af014SAnna Zaks         else
8560dbb783cSCraig Topper           return RuntimeDefinition(MD, nullptr);
857920af014SAnna Zaks       }
8585808eb80SAnna Zaks 
85963282aefSAnna Zaks   } else {
86063282aefSAnna Zaks     // This is a class method.
86163282aefSAnna Zaks     // If we have type info for the receiver class, we are calling via
86263282aefSAnna Zaks     // class name.
86363282aefSAnna Zaks     if (ObjCInterfaceDecl *IDecl = E->getReceiverInterface()) {
86463282aefSAnna Zaks       // Find/Return the method implementation.
86585383182SAnna Zaks       return RuntimeDefinition(IDecl->lookupPrivateClassMethod(Sel));
8664f7df9beSJordan Rose     }
86763282aefSAnna Zaks   }
86863282aefSAnna Zaks 
869123af098SAnna Zaks   return RuntimeDefinition();
8704f7df9beSJordan Rose }
8714f7df9beSJordan Rose 
872514f9354SJordan Rose bool ObjCMethodCall::argumentsMayEscape() const {
873514f9354SJordan Rose   if (isInSystemHeader() && !isInstanceMessage()) {
874514f9354SJordan Rose     Selector Sel = getSelector();
875514f9354SJordan Rose     if (Sel.getNumArgs() == 1 &&
876514f9354SJordan Rose         Sel.getIdentifierInfoForSlot(0)->isStr("valueWithPointer"))
877514f9354SJordan Rose       return true;
878514f9354SJordan Rose   }
879514f9354SJordan Rose 
880514f9354SJordan Rose   return CallEvent::argumentsMayEscape();
881514f9354SJordan Rose }
882514f9354SJordan Rose 
88342e8d649SJordan Rose void ObjCMethodCall::getInitialStackFrameContents(
88442e8d649SJordan Rose                                              const StackFrameContext *CalleeCtx,
88542e8d649SJordan Rose                                              BindingsTy &Bindings) const {
88642e8d649SJordan Rose   const ObjCMethodDecl *D = cast<ObjCMethodDecl>(CalleeCtx->getDecl());
88742e8d649SJordan Rose   SValBuilder &SVB = getState()->getStateManager().getSValBuilder();
88842e8d649SJordan Rose   addParameterValuesToBindings(CalleeCtx, Bindings, SVB, *this,
8892ff16004STed Kremenek                                D->parameters());
89042e8d649SJordan Rose 
89142e8d649SJordan Rose   SVal SelfVal = getReceiverSVal();
89242e8d649SJordan Rose   if (!SelfVal.isUnknown()) {
89342e8d649SJordan Rose     const VarDecl *SelfD = CalleeCtx->getAnalysisDeclContext()->getSelfDecl();
89442e8d649SJordan Rose     MemRegionManager &MRMgr = SVB.getRegionManager();
89542e8d649SJordan Rose     Loc SelfLoc = SVB.makeLoc(MRMgr.getVarRegion(SelfD, CalleeCtx));
89642e8d649SJordan Rose     Bindings.push_back(std::make_pair(SelfLoc, SelfVal));
89742e8d649SJordan Rose   }
89842e8d649SJordan Rose }
89942e8d649SJordan Rose 
900ce6c99a5SJordan Rose CallEventRef<>
901fcd016e5SJordan Rose CallEventManager::getSimpleCall(const CallExpr *CE, ProgramStateRef State,
902fcd016e5SJordan Rose                                 const LocationContext *LCtx) {
903fcd016e5SJordan Rose   if (const CXXMemberCallExpr *MCE = dyn_cast<CXXMemberCallExpr>(CE))
904fcd016e5SJordan Rose     return create<CXXMemberCall>(MCE, State, LCtx);
905fcd016e5SJordan Rose 
906fcd016e5SJordan Rose   if (const CXXOperatorCallExpr *OpCE = dyn_cast<CXXOperatorCallExpr>(CE)) {
907fcd016e5SJordan Rose     const FunctionDecl *DirectCallee = OpCE->getDirectCallee();
908fcd016e5SJordan Rose     if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DirectCallee))
909fcd016e5SJordan Rose       if (MD->isInstance())
910fcd016e5SJordan Rose         return create<CXXMemberOperatorCall>(OpCE, State, LCtx);
911fcd016e5SJordan Rose 
912fcd016e5SJordan Rose   } else if (CE->getCallee()->getType()->isBlockPointerType()) {
913fcd016e5SJordan Rose     return create<BlockCall>(CE, State, LCtx);
914fcd016e5SJordan Rose   }
915fcd016e5SJordan Rose 
916fcd016e5SJordan Rose   // Otherwise, it's a normal function call, static member function call, or
917fcd016e5SJordan Rose   // something we can't reason about.
9182a833ca5SJordan Rose   return create<SimpleFunctionCall>(CE, State, LCtx);
919fcd016e5SJordan Rose }
920c2d249ceSJordan Rose 
921c2d249ceSJordan Rose 
922c2d249ceSJordan Rose CallEventRef<>
923c2d249ceSJordan Rose CallEventManager::getCaller(const StackFrameContext *CalleeCtx,
924c2d249ceSJordan Rose                             ProgramStateRef State) {
925c2d249ceSJordan Rose   const LocationContext *ParentCtx = CalleeCtx->getParent();
926c2d249ceSJordan Rose   const LocationContext *CallerCtx = ParentCtx->getCurrentStackFrame();
927c2d249ceSJordan Rose   assert(CallerCtx && "This should not be used for top-level stack frames");
928c2d249ceSJordan Rose 
929c2d249ceSJordan Rose   const Stmt *CallSite = CalleeCtx->getCallSite();
930c2d249ceSJordan Rose 
931c2d249ceSJordan Rose   if (CallSite) {
932c2d249ceSJordan Rose     if (const CallExpr *CE = dyn_cast<CallExpr>(CallSite))
933c2d249ceSJordan Rose       return getSimpleCall(CE, State, CallerCtx);
934c2d249ceSJordan Rose 
935c2d249ceSJordan Rose     switch (CallSite->getStmtClass()) {
9368d48938bSJordan Rose     case Stmt::CXXConstructExprClass:
9378d48938bSJordan Rose     case Stmt::CXXTemporaryObjectExprClass: {
938c2d249ceSJordan Rose       SValBuilder &SVB = State->getStateManager().getSValBuilder();
939c2d249ceSJordan Rose       const CXXMethodDecl *Ctor = cast<CXXMethodDecl>(CalleeCtx->getDecl());
940c2d249ceSJordan Rose       Loc ThisPtr = SVB.getCXXThis(Ctor, CalleeCtx);
941c2d249ceSJordan Rose       SVal ThisVal = State->getSVal(ThisPtr);
942c2d249ceSJordan Rose 
943c2d249ceSJordan Rose       return getCXXConstructorCall(cast<CXXConstructExpr>(CallSite),
944c2d249ceSJordan Rose                                    ThisVal.getAsRegion(), State, CallerCtx);
945c2d249ceSJordan Rose     }
946c2d249ceSJordan Rose     case Stmt::CXXNewExprClass:
947c2d249ceSJordan Rose       return getCXXAllocatorCall(cast<CXXNewExpr>(CallSite), State, CallerCtx);
948c2d249ceSJordan Rose     case Stmt::ObjCMessageExprClass:
949c2d249ceSJordan Rose       return getObjCMethodCall(cast<ObjCMessageExpr>(CallSite),
950c2d249ceSJordan Rose                                State, CallerCtx);
951c2d249ceSJordan Rose     default:
952c2d249ceSJordan Rose       llvm_unreachable("This is not an inlineable statement.");
953c2d249ceSJordan Rose     }
954c2d249ceSJordan Rose   }
955c2d249ceSJordan Rose 
956c2d249ceSJordan Rose   // Fall back to the CFG. The only thing we haven't handled yet is
957c2d249ceSJordan Rose   // destructors, though this could change in the future.
958c2d249ceSJordan Rose   const CFGBlock *B = CalleeCtx->getCallSiteBlock();
959c2d249ceSJordan Rose   CFGElement E = (*B)[CalleeCtx->getIndex()];
9602a01f5d4SDavid Blaikie   assert(E.getAs<CFGImplicitDtor>() &&
9612a01f5d4SDavid Blaikie          "All other CFG elements should have exprs");
9622a01f5d4SDavid Blaikie   assert(!E.getAs<CFGTemporaryDtor>() && "We don't handle temporaries yet");
963c2d249ceSJordan Rose 
964c2d249ceSJordan Rose   SValBuilder &SVB = State->getStateManager().getSValBuilder();
965c2d249ceSJordan Rose   const CXXDestructorDecl *Dtor = cast<CXXDestructorDecl>(CalleeCtx->getDecl());
966c2d249ceSJordan Rose   Loc ThisPtr = SVB.getCXXThis(Dtor, CalleeCtx);
967c2d249ceSJordan Rose   SVal ThisVal = State->getSVal(ThisPtr);
968c2d249ceSJordan Rose 
969c2d249ceSJordan Rose   const Stmt *Trigger;
97000be69abSDavid Blaikie   if (Optional<CFGAutomaticObjDtor> AutoDtor = E.getAs<CFGAutomaticObjDtor>())
97100be69abSDavid Blaikie     Trigger = AutoDtor->getTriggerStmt();
9721ccc43d5SJordan Rose   else if (Optional<CFGDeleteDtor> DeleteDtor = E.getAs<CFGDeleteDtor>())
9731ccc43d5SJordan Rose     Trigger = cast<Stmt>(DeleteDtor->getDeleteExpr());
974c2d249ceSJordan Rose   else
975c2d249ceSJordan Rose     Trigger = Dtor->getBody();
976c2d249ceSJordan Rose 
977c2d249ceSJordan Rose   return getCXXDestructorCall(Dtor, Trigger, ThisVal.getAsRegion(),
97800be69abSDavid Blaikie                               E.getAs<CFGBaseDtor>().hasValue(), State,
97900be69abSDavid Blaikie                               CallerCtx);
980c2d249ceSJordan Rose }
981