CallEvent.h revision f540c54701e3eeb34cb619a3a4eb18f1ac70ef2d
1f540c54701e3eeb34cb619a3a4eb18f1ac70ef2dJordan Rose//===- CallEvent.h - Wrapper for all function and method calls ----*- C++ -*--// 2740d490593e0de8732a697c9f77b90ddd463863bJordan Rose// 3740d490593e0de8732a697c9f77b90ddd463863bJordan Rose// The LLVM Compiler Infrastructure 4740d490593e0de8732a697c9f77b90ddd463863bJordan Rose// 5740d490593e0de8732a697c9f77b90ddd463863bJordan Rose// This file is distributed under the University of Illinois Open Source 6740d490593e0de8732a697c9f77b90ddd463863bJordan Rose// License. See LICENSE.TXT for details. 7740d490593e0de8732a697c9f77b90ddd463863bJordan Rose// 8740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//===----------------------------------------------------------------------===// 9740d490593e0de8732a697c9f77b90ddd463863bJordan Rose// 10740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \file This file defines CallEvent and its subclasses, which represent path- 11740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// sensitive instances of different kinds of function and method calls 12740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// (C, C++, and Objective-C). 13740d490593e0de8732a697c9f77b90ddd463863bJordan Rose// 14740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//===----------------------------------------------------------------------===// 15740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 16740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#ifndef LLVM_CLANG_STATICANALYZER_PATHSENSITIVE_CALL 17740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#define LLVM_CLANG_STATICANALYZER_PATHSENSITIVE_CALL 18740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 19740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/Basic/SourceManager.h" 20740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/AST/DeclCXX.h" 21740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/AST/ExprCXX.h" 22740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/AST/ExprObjC.h" 23de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h" 24740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h" 25b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose#include "llvm/ADT/PointerIntPair.h" 26740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 27740d490593e0de8732a697c9f77b90ddd463863bJordan Rosenamespace clang { 2828038f33aa2db4833881fea757a1f0daf85ac02bJordan Roseclass ProgramPoint; 2928038f33aa2db4833881fea757a1f0daf85ac02bJordan Roseclass ProgramPointTag; 3028038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose 31740d490593e0de8732a697c9f77b90ddd463863bJordan Rosenamespace ento { 32740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 33740d490593e0de8732a697c9f77b90ddd463863bJordan Roseenum CallEventKind { 34740d490593e0de8732a697c9f77b90ddd463863bJordan Rose CE_Function, 35740d490593e0de8732a697c9f77b90ddd463863bJordan Rose CE_CXXMember, 36fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose CE_CXXMemberOperator, 37c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose CE_BEG_CXX_INSTANCE_CALLS = CE_CXXMember, 38c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose CE_END_CXX_INSTANCE_CALLS = CE_CXXMemberOperator, 39740d490593e0de8732a697c9f77b90ddd463863bJordan Rose CE_Block, 40740d490593e0de8732a697c9f77b90ddd463863bJordan Rose CE_BEG_SIMPLE_CALLS = CE_Function, 41740d490593e0de8732a697c9f77b90ddd463863bJordan Rose CE_END_SIMPLE_CALLS = CE_Block, 42740d490593e0de8732a697c9f77b90ddd463863bJordan Rose CE_CXXConstructor, 438d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose CE_CXXDestructor, 4470cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose CE_CXXAllocator, 45740d490593e0de8732a697c9f77b90ddd463863bJordan Rose CE_BEG_FUNCTION_CALLS = CE_Function, 4670cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose CE_END_FUNCTION_CALLS = CE_CXXAllocator, 478919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose CE_ObjCMessage 48740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}; 49740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 50b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 51740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents an abstract call to a function or method along a 52740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// particular path. 53740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass CallEvent { 54740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic: 55740d490593e0de8732a697c9f77b90ddd463863bJordan Rose typedef CallEventKind Kind; 56740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 57b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseprivate: 58b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose // PointerIntPair doesn't respect IntrusiveRefCntPtr, so we have to manually 59b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose // retain and release the state. 60b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose llvm::PointerIntPair<const ProgramState *, 2> State; 61b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose llvm::PointerIntPair<const LocationContext *, 2> LCtx; 62b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose llvm::PointerUnion<const Expr *, const Decl *> Origin; 63b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 64740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected: 65b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose // This is user data for subclasses. 66b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose const void *Data; 67b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose SourceLocation Location; 68b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 69b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose CallEvent(const Expr *E, ProgramStateRef state, const LocationContext *lctx, 70b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose Kind k) 71b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose : State(state.getPtr(), (k & 0x3)), 72b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose LCtx(lctx, ((k >> 2) & 0x3)), 73b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose Origin(E) { 74b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose IntrusiveRefCntPtrInfo<const ProgramState>::retain(getState()); 75b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose assert(k == getKind() && "More kinds than bits in the PointerIntPairs."); 76b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 77b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 78b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose CallEvent(const Decl *D, ProgramStateRef state, const LocationContext *lctx, 79b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose Kind k) 80b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose : State(state.getPtr(), (k & 0x3)), 81b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose LCtx(lctx, ((k >> 2) & 0x3)), 82b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose Origin(D) { 83b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose IntrusiveRefCntPtrInfo<const ProgramState>::retain(getState()); 84b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose assert(k == getKind() && "More kinds than bits in the PointerIntPairs."); 85b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 86b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 87b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose const ProgramState *getState() const { 88b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return State.getPointer(); 89b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 90b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 91b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose const LocationContext *getLocationContext() const { 92b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return LCtx.getPointer(); 93b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 94b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 95b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose ~CallEvent() { 96b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose IntrusiveRefCntPtrInfo<const ProgramState>::release(getState()); 97b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 98740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 99740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 100740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Get the value of arbitrary expressions at this point in the path. 101740d490593e0de8732a697c9f77b90ddd463863bJordan Rose SVal getSVal(const Stmt *S) const { 102b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getState()->getSVal(S, getLocationContext()); 103740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 104740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 105740d490593e0de8732a697c9f77b90ddd463863bJordan Rose typedef SmallVectorImpl<const MemRegion *> RegionList; 106740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 107740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Used to specify non-argument regions that will be invalidated as a 108740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// result of this call. 1094b3918e9534e46f9ac067c6e0018f94613292efaJordan Rose void getExtraInvalidatedRegions(RegionList &Regions) const; 110740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 111b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose QualType getDeclaredResultType() const; 112740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 113740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic: 114b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose /// \brief Returns the kind of call this is. 115b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose Kind getKind() const { 116b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return static_cast<Kind>((State.getInt()) | (LCtx.getInt() << 2)); 117b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 118b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 119740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Returns the declaration of the function or method that will be 120740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// called. May be null. 121b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose const Decl *getDecl() const; 122740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 123ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose /// \brief Returns the definition of the function or method that will be 1249dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks /// called. Returns NULL if the definition cannot be found; ex: due to 1259dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks /// dynamic dispatch in ObjC methods. 1269dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks const Decl *getRuntimeDefinition() const; 127ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose 128740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Returns the expression whose value will be the result of this call. 129740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// May be null. 130b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose const Expr *getOriginExpr() const { 131b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return Origin.dyn_cast<const Expr *>(); 132b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 133740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 134740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Returns the number of arguments (explicit and implicit). 135740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// 136740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// Note that this may be greater than the number of parameters in the 137740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// callee's declaration, and that it may include arguments not written in 138740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// the source. 139b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose unsigned getNumArgs() const; 140740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 141740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Returns true if the callee is known to be from a system header. 142740d490593e0de8732a697c9f77b90ddd463863bJordan Rose bool isInSystemHeader() const { 143740d490593e0de8732a697c9f77b90ddd463863bJordan Rose const Decl *D = getDecl(); 144740d490593e0de8732a697c9f77b90ddd463863bJordan Rose if (!D) 145740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return false; 146740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 147740d490593e0de8732a697c9f77b90ddd463863bJordan Rose SourceLocation Loc = D->getLocation(); 148740d490593e0de8732a697c9f77b90ddd463863bJordan Rose if (Loc.isValid()) { 149740d490593e0de8732a697c9f77b90ddd463863bJordan Rose const SourceManager &SM = 150b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose getState()->getStateManager().getContext().getSourceManager(); 151740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return SM.isInSystemHeader(D->getLocation()); 152740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 153740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 154740d490593e0de8732a697c9f77b90ddd463863bJordan Rose // Special case for implicitly-declared global operator new/delete. 155740d490593e0de8732a697c9f77b90ddd463863bJordan Rose // These should be considered system functions. 156740d490593e0de8732a697c9f77b90ddd463863bJordan Rose if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) 157740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return FD->isOverloadedOperator() && FD->isImplicit() && FD->isGlobal(); 158740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 159740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return false; 160740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 161740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 162de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose /// \brief Returns a source range for the entire call, suitable for 163de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose /// outputting in diagnostics. 164b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose SourceRange getSourceRange() const; 165de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose 166740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Returns the value of a given argument at the time of the call. 167b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose SVal getArgSVal(unsigned Index) const; 168740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 169740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Returns the expression associated with a given argument. 170740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// May be null if this expression does not appear in the source. 171b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose const Expr *getArgExpr(unsigned Index) const; 172740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 173740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Returns the source range for errors associated with this argument. 174740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// May be invalid if the argument is not written in the source. 175740d490593e0de8732a697c9f77b90ddd463863bJordan Rose // FIXME: Is it better to return an invalid range or the range of the origin 176740d490593e0de8732a697c9f77b90ddd463863bJordan Rose // expression? 177b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose SourceRange getArgSourceRange(unsigned Index) const; 178740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 179740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Returns the result type, adjusted for references. 180740d490593e0de8732a697c9f77b90ddd463863bJordan Rose QualType getResultType() const; 181740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 182e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// \brief Returns the value of the implicit 'this' object, or UndefinedVal if 183e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// this is not a C++ member function call. 184b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose SVal getCXXThisVal() const; 185e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose 186740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Returns true if any of the arguments appear to represent callbacks. 187740d490593e0de8732a697c9f77b90ddd463863bJordan Rose bool hasNonZeroCallbackArg() const; 188740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 18985d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose /// \brief Returns true if any of the arguments are known to escape to long- 19085d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose /// term storage, even if this method will not modify them. 19185d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose // NOTE: The exact semantics of this are still being defined! 19285d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose // We don't really want a list of hardcoded exceptions in the long run, 19385d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose // but we don't want duplicated lists of known APIs in the short term either. 194b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose bool argumentsMayEscape() const; 19585d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose 19628038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose /// \brief Returns an appropriate ProgramPoint for this call. 1978d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose ProgramPoint getProgramPoint(bool IsPreVisit = false, 19828038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose const ProgramPointTag *Tag = 0) const; 19928038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose 200740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Returns a new state with all argument regions invalidated. 201740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// 202740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// This accepts an alternate state in case some processing has already 203740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// occurred. 204740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ProgramStateRef invalidateRegions(unsigned BlockCount, 205740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ProgramStateRef Orig = 0) const; 206740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 20785d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose /// \brief Returns true if this is a statement that can be considered for 20885d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose /// inlining. 20985d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose static bool mayBeInlined(const Stmt *S); 21085d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose 211e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose // Iterator access to formal parameters and their types. 212740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprivate: 213740d490593e0de8732a697c9f77b90ddd463863bJordan Rose typedef std::const_mem_fun_t<QualType, ParmVarDecl> get_type_fun; 214740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 215740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic: 216e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose typedef const ParmVarDecl * const *param_iterator; 217e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose 218e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// Returns an iterator over the call's formal parameters. 219e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// 220e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// If UseDefinitionParams is set, this will return the parameter decls 221e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// used in the callee's definition (suitable for inlining). Most of the 222e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// time it is better to use the decl found by name lookup, which likely 223e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// carries more annotations. 224e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// 225e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// Remember that the number of formal parameters may not match the number 226e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// of arguments for all calls. However, the first parameter will always 227e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// correspond with the argument value returned by \c getArgSVal(0). 228e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// 229e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// If the call has no accessible declaration (or definition, if 230e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// \p UseDefinitionParams is set), \c param_begin() will be equal to 231e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// \c param_end(). 232b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose param_iterator param_begin(bool UseDefinitionParams = false) const; 233e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// \sa param_begin() 234b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose param_iterator param_end(bool UseDefinitionParams = false) const; 235e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose 236740d490593e0de8732a697c9f77b90ddd463863bJordan Rose typedef llvm::mapped_iterator<param_iterator, get_type_fun> 237740d490593e0de8732a697c9f77b90ddd463863bJordan Rose param_type_iterator; 238740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 239e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// Returns an iterator over the types of the call's formal parameters. 240e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// 241e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// This uses the callee decl found by default name lookup rather than the 242e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// definition because it represents a public interface, and probably has 243e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// more annotations. 244740d490593e0de8732a697c9f77b90ddd463863bJordan Rose param_type_iterator param_type_begin() const { 245740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return llvm::map_iterator(param_begin(), 246740d490593e0de8732a697c9f77b90ddd463863bJordan Rose get_type_fun(&ParmVarDecl::getType)); 247740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 248e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// \sa param_type_begin() 249740d490593e0de8732a697c9f77b90ddd463863bJordan Rose param_type_iterator param_type_end() const { 250740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return llvm::map_iterator(param_end(), get_type_fun(&ParmVarDecl::getType)); 251740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 252740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 2530ffbfd1a7f80f9a3c07317cb8f44c562f2ba1ba5Jordan Rose // For debugging purposes only 254b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose void dump(raw_ostream &Out) const; 2550ffbfd1a7f80f9a3c07317cb8f44c562f2ba1ba5Jordan Rose LLVM_ATTRIBUTE_USED void dump() const { dump(llvm::errs()); } 2560ffbfd1a7f80f9a3c07317cb8f44c562f2ba1ba5Jordan Rose 257740d490593e0de8732a697c9f77b90ddd463863bJordan Rose static bool classof(const CallEvent *) { return true; } 258740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}; 259740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 260b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 261740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a call to any sort of function that might have a 262740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// FunctionDecl. 263740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass AnyFunctionCall : public CallEvent { 264b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose friend class CallEvent; 265b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 266740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected: 267b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose AnyFunctionCall(const Expr *E, ProgramStateRef St, 268b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose const LocationContext *LCtx, Kind K) 269b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose : CallEvent(E, St, LCtx, K) {} 270b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose AnyFunctionCall(const Decl *D, ProgramStateRef St, 271b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose const LocationContext *LCtx, Kind K) 272b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose : CallEvent(D, St, LCtx, K) {} 273740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 274b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose // Most function calls have no extra invalidated regions. 2754b3918e9534e46f9ac067c6e0018f94613292efaJordan Rose void getExtraInvalidatedRegions(RegionList &Regions) const {} 276740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 277740d490593e0de8732a697c9f77b90ddd463863bJordan Rose QualType getDeclaredResultType() const; 278740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 279740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic: 280b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose // This function is overridden by subclasses, but they must return 281b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose // a FunctionDecl. 282b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose const FunctionDecl *getDecl() const { 283b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return cast_or_null<FunctionDecl>(CallEvent::getDecl()); 284b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 285740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 2869dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks const Decl *getRuntimeDefinition() const { 287ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose const FunctionDecl *FD = getDecl(); 288ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose // Note that hasBody() will fill FD with the definition FunctionDecl. 289ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose if (FD && FD->hasBody(FD)) 290ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose return FD; 291ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose return 0; 292ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose } 293ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose 29485d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose bool argumentsMayEscape() const; 29585d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose 296b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose SVal getArgSVal(unsigned Index) const; 297b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose SourceRange getArgSourceRange(unsigned Index) const; 298b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 299b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose param_iterator param_begin(bool UseDefinitionParams = false) const; 300b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose param_iterator param_end(bool UseDefinitionParams = false) const; 301b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 302740d490593e0de8732a697c9f77b90ddd463863bJordan Rose static bool classof(const CallEvent *CA) { 303740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return CA->getKind() >= CE_BEG_FUNCTION_CALLS && 304740d490593e0de8732a697c9f77b90ddd463863bJordan Rose CA->getKind() <= CE_END_FUNCTION_CALLS; 305740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 306740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}; 307740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 308740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a call to a written as a CallExpr. 309740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass SimpleCall : public AnyFunctionCall { 310740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected: 311b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose SimpleCall(const CallExpr *CE, ProgramStateRef St, 312740d490593e0de8732a697c9f77b90ddd463863bJordan Rose const LocationContext *LCtx, Kind K) 313b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose : AnyFunctionCall(CE, St, LCtx, K) { 314740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 315740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 316740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic: 317b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose const CallExpr *getOriginExpr() const { 318b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return cast<CallExpr>(AnyFunctionCall::getOriginExpr()); 319b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 320740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 321740d490593e0de8732a697c9f77b90ddd463863bJordan Rose const FunctionDecl *getDecl() const; 322740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 323b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose unsigned getNumArgs() const { return getOriginExpr()->getNumArgs(); } 324b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose SourceRange getSourceRange() const { 325b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getSourceRange(); 326b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 327740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 328740d490593e0de8732a697c9f77b90ddd463863bJordan Rose const Expr *getArgExpr(unsigned Index) const { 329b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getArg(Index); 330740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 331740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 332740d490593e0de8732a697c9f77b90ddd463863bJordan Rose static bool classof(const CallEvent *CA) { 333740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return CA->getKind() >= CE_BEG_SIMPLE_CALLS && 334740d490593e0de8732a697c9f77b90ddd463863bJordan Rose CA->getKind() <= CE_END_SIMPLE_CALLS; 335740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 336740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}; 337740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 338740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a C function or static C++ member function call. 339740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// 340740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// Example: \c fun() 341740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass FunctionCall : public SimpleCall { 342740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic: 343740d490593e0de8732a697c9f77b90ddd463863bJordan Rose FunctionCall(const CallExpr *CE, ProgramStateRef St, 344740d490593e0de8732a697c9f77b90ddd463863bJordan Rose const LocationContext *LCtx) 345740d490593e0de8732a697c9f77b90ddd463863bJordan Rose : SimpleCall(CE, St, LCtx, CE_Function) {} 346740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 347b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose SVal getCXXThisVal() const { return UndefinedVal(); } 348b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 349740d490593e0de8732a697c9f77b90ddd463863bJordan Rose static bool classof(const CallEvent *CA) { 350740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return CA->getKind() == CE_Function; 351740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 352740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}; 353740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 354c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// \brief Represents a non-static C++ member function call, no matter how 355c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// it is written. 356c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Roseclass CXXInstanceCall : public SimpleCall { 357b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose friend class CallEvent; 358b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 359740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected: 3604b3918e9534e46f9ac067c6e0018f94613292efaJordan Rose void getExtraInvalidatedRegions(RegionList &Regions) const; 361740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 362c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose CXXInstanceCall(const CallExpr *CE, ProgramStateRef St, 363c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose const LocationContext *LCtx, Kind K) 364c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose : SimpleCall(CE, St, LCtx, K) {} 365c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose 366c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rosepublic: 3679dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks const Decl *getRuntimeDefinition() const; 368c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose 369c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose static bool classof(const CallEvent *CA) { 370c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose return CA->getKind() >= CE_BEG_CXX_INSTANCE_CALLS && 371c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose CA->getKind() <= CE_END_CXX_INSTANCE_CALLS; 372c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose } 373c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose}; 374c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose 375c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// \brief Represents a non-static C++ member function call. 376c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// 377c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// Example: \c obj.fun() 378c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Roseclass CXXMemberCall : public CXXInstanceCall { 379740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic: 380740d490593e0de8732a697c9f77b90ddd463863bJordan Rose CXXMemberCall(const CXXMemberCallExpr *CE, ProgramStateRef St, 381c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose const LocationContext *LCtx) 382c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose : CXXInstanceCall(CE, St, LCtx, CE_CXXMember) {} 383740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 384740d490593e0de8732a697c9f77b90ddd463863bJordan Rose const CXXMemberCallExpr *getOriginExpr() const { 385740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return cast<CXXMemberCallExpr>(SimpleCall::getOriginExpr()); 386740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 387740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 388e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose SVal getCXXThisVal() const; 389e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose 390740d490593e0de8732a697c9f77b90ddd463863bJordan Rose static bool classof(const CallEvent *CA) { 391740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return CA->getKind() == CE_CXXMember; 392740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 393740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}; 394740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 395fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// \brief Represents a C++ overloaded operator call where the operator is 396fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// implemented as a non-static member function. 397fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// 398fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// Example: <tt>iter + 1</tt> 399c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Roseclass CXXMemberOperatorCall : public CXXInstanceCall { 400fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rosepublic: 401fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose CXXMemberOperatorCall(const CXXOperatorCallExpr *CE, ProgramStateRef St, 402fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose const LocationContext *LCtx) 403c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose : CXXInstanceCall(CE, St, LCtx, CE_CXXMemberOperator) {} 404fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose 405fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose const CXXOperatorCallExpr *getOriginExpr() const { 406fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose return cast<CXXOperatorCallExpr>(SimpleCall::getOriginExpr()); 407fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose } 408fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose 409fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose unsigned getNumArgs() const { return getOriginExpr()->getNumArgs() - 1; } 410fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose const Expr *getArgExpr(unsigned Index) const { 411fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose return getOriginExpr()->getArg(Index + 1); 412fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose } 413fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose 414e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose SVal getCXXThisVal() const; 415e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose 416fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose static bool classof(const CallEvent *CA) { 417fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose return CA->getKind() == CE_CXXMemberOperator; 418fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose } 419fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose}; 420fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose 421740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a call to a block. 422740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// 423fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// Example: <tt>^{ /* ... */ }()</tt> 424740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass BlockCall : public SimpleCall { 425b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose friend class CallEvent; 426b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 427740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected: 4284b3918e9534e46f9ac067c6e0018f94613292efaJordan Rose void getExtraInvalidatedRegions(RegionList &Regions) const; 429740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 430740d490593e0de8732a697c9f77b90ddd463863bJordan Rose QualType getDeclaredResultType() const; 431740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 432740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic: 433740d490593e0de8732a697c9f77b90ddd463863bJordan Rose BlockCall(const CallExpr *CE, ProgramStateRef St, 434740d490593e0de8732a697c9f77b90ddd463863bJordan Rose const LocationContext *LCtx) 43569f87c956b3ac2b80124fd9604af012e1061473aJordan Rose : SimpleCall(CE, St, LCtx, CE_Block) {} 43669f87c956b3ac2b80124fd9604af012e1061473aJordan Rose 43769f87c956b3ac2b80124fd9604af012e1061473aJordan Rose /// \brief Returns the region associated with this instance of the block. 43869f87c956b3ac2b80124fd9604af012e1061473aJordan Rose /// 43969f87c956b3ac2b80124fd9604af012e1061473aJordan Rose /// This may be NULL if the block's origin is unknown. 44069f87c956b3ac2b80124fd9604af012e1061473aJordan Rose const BlockDataRegion *getBlockRegion() const; 44169f87c956b3ac2b80124fd9604af012e1061473aJordan Rose 44269f87c956b3ac2b80124fd9604af012e1061473aJordan Rose /// \brief Gets the declaration of the block. 44369f87c956b3ac2b80124fd9604af012e1061473aJordan Rose /// 44469f87c956b3ac2b80124fd9604af012e1061473aJordan Rose /// This is not an override of getDecl() because AnyFunctionCall has already 44569f87c956b3ac2b80124fd9604af012e1061473aJordan Rose /// assumed that it's a FunctionDecl. 44669f87c956b3ac2b80124fd9604af012e1061473aJordan Rose const BlockDecl *getBlockDecl() const { 44769f87c956b3ac2b80124fd9604af012e1061473aJordan Rose const BlockDataRegion *BR = getBlockRegion(); 44869f87c956b3ac2b80124fd9604af012e1061473aJordan Rose if (!BR) 44969f87c956b3ac2b80124fd9604af012e1061473aJordan Rose return 0; 45069f87c956b3ac2b80124fd9604af012e1061473aJordan Rose return BR->getDecl(); 451740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 452740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 4539dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks const Decl *getRuntimeDefinition() const { 454ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose return getBlockDecl(); 455ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose } 456ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose 457b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose param_iterator param_begin(bool UseDefinitionParams = false) const; 458b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose param_iterator param_end(bool UseDefinitionParams = false) const; 459b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 460b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose SVal getCXXThisVal() const { return UndefinedVal(); } 461b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 462740d490593e0de8732a697c9f77b90ddd463863bJordan Rose static bool classof(const CallEvent *CA) { 463740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return CA->getKind() == CE_Block; 464740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 465740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}; 466740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 467740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a call to a C++ constructor. 468740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// 469740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// Example: \c T(1) 470740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass CXXConstructorCall : public AnyFunctionCall { 471b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose friend class CallEvent; 472740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 473740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected: 4744b3918e9534e46f9ac067c6e0018f94613292efaJordan Rose void getExtraInvalidatedRegions(RegionList &Regions) const; 475740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 476740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic: 477b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose /// Represents a constructor call to a new or unknown region. 478b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose CXXConstructorCall(const CXXConstructExpr *CE, ProgramStateRef St, 479740d490593e0de8732a697c9f77b90ddd463863bJordan Rose const LocationContext *LCtx) 480b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose : AnyFunctionCall(CE, St, LCtx, CE_CXXConstructor) { 481b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose Data = 0; 482b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 483b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 484b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose /// Represents a constructor call on an existing object region. 485b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose CXXConstructorCall(const CXXConstructExpr *CE, const MemRegion *target, 486740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ProgramStateRef St, const LocationContext *LCtx) 487b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose : AnyFunctionCall(CE, St, LCtx, CE_CXXConstructor) { 488b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose Data = target; 489b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 490740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 491b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose const CXXConstructExpr *getOriginExpr() const { 492b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return cast<CXXConstructExpr>(AnyFunctionCall::getOriginExpr()); 493b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 494b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 495b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose SourceRange getSourceRange() const { 496b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getSourceRange(); 497b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 498740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 499740d490593e0de8732a697c9f77b90ddd463863bJordan Rose const CXXConstructorDecl *getDecl() const { 500b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getConstructor(); 501740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 502740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 503b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose unsigned getNumArgs() const { return getOriginExpr()->getNumArgs(); } 504740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 505740d490593e0de8732a697c9f77b90ddd463863bJordan Rose const Expr *getArgExpr(unsigned Index) const { 506b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getArg(Index); 507740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 508740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 509e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose SVal getCXXThisVal() const; 510e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose 511740d490593e0de8732a697c9f77b90ddd463863bJordan Rose static bool classof(const CallEvent *CA) { 512740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return CA->getKind() == CE_CXXConstructor; 513740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 514740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}; 515740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 5168d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose/// \brief Represents an implicit call to a C++ destructor. 5178d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose/// 5188d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose/// This can occur at the end of a scope (for automatic objects), at the end 5198d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose/// of a full-expression (for temporaries), or as part of a delete. 5208d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Roseclass CXXDestructorCall : public AnyFunctionCall { 521b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose friend class CallEvent; 5228d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose 5238d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Roseprotected: 5244b3918e9534e46f9ac067c6e0018f94613292efaJordan Rose void getExtraInvalidatedRegions(RegionList &Regions) const; 5258d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose 5268d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rosepublic: 527b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose /// Creates an implicit destructor. 528b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose /// 529b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose /// \param DD The destructor that will be called. 530b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose /// \param Trigger The statement whose completion causes this destructor call. 531b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose /// \param Target The object region to be destructed. 532b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose /// \param St The path-sensitive state at this point in the program. 533b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose /// \param LCtx The location context at this point in the program. 534b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose CXXDestructorCall(const CXXDestructorDecl *DD, const Stmt *Trigger, 535b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose const MemRegion *Target, ProgramStateRef St, 5368d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose const LocationContext *LCtx) 537b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose : AnyFunctionCall(DD, St, LCtx, CE_CXXDestructor) { 538b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose Data = Target; 539b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose Location = Trigger->getLocEnd(); 540b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 5418d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose 542b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose SourceRange getSourceRange() const { return Location; } 5438d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose unsigned getNumArgs() const { return 0; } 5448d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose 545e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose SVal getCXXThisVal() const; 5469dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks const Decl *getRuntimeDefinition() const; 547e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose 5488d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose static bool classof(const CallEvent *CA) { 5498d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose return CA->getKind() == CE_CXXDestructor; 5508d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose } 5518d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose}; 5528d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose 5530e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose/// \brief Represents the memory allocation call in a C++ new-expression. 5540e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose/// 5550e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose/// This is a call to "operator new". 55670cbf3cc09eb21db1108396d30a414ea66d842ccJordan Roseclass CXXAllocatorCall : public AnyFunctionCall { 55770cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rosepublic: 558b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose CXXAllocatorCall(const CXXNewExpr *E, ProgramStateRef St, 55970cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose const LocationContext *LCtx) 560b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose : AnyFunctionCall(E, St, LCtx, CE_CXXAllocator) {} 56170cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose 562b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose const CXXNewExpr *getOriginExpr() const { 563b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return cast<CXXNewExpr>(AnyFunctionCall::getOriginExpr()); 564b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 565b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 566b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose // FIXME: This isn't exactly the range of the allocator... 567b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose SourceRange getSourceRange() const { 568b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getSourceRange(); 569b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 57070cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose 57170cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose const FunctionDecl *getDecl() const { 572b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getOperatorNew(); 57370cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose } 57470cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose 575b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose unsigned getNumArgs() const { 576b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getNumPlacementArgs() + 1; 577b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 57870cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose 57970cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose const Expr *getArgExpr(unsigned Index) const { 58070cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose // The first argument of an allocator call is the size of the allocation. 58170cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose if (Index == 0) 58270cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose return 0; 583b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getPlacementArg(Index - 1); 58470cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose } 58570cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose 586b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose SVal getCXXThisVal() const { return UndefinedVal(); } 587b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 58870cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose static bool classof(const CallEvent *CE) { 58970cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose return CE->getKind() == CE_CXXAllocator; 59070cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose } 59170cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose}; 59270cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose 5938919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose/// \brief Represents the ways an Objective-C message send can occur. 5948919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose// 5958919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose// Note to maintainers: OCM_Message should always be last, since it does not 5968919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose// need to fit in the Data field's low bits. 5978919e688dc610d1f632a4d43f7f1489f67255476Jordan Roseenum ObjCMessageKind { 5988919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose OCM_PropertyAccess, 5998919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose OCM_Subscript, 6008919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose OCM_Message 6018919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose}; 6028919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose 603cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose/// \brief Represents any expression that calls an Objective-C method. 6048919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose/// 6058919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose/// This includes all of the kinds listed in ObjCMessageKind. 606cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Roseclass ObjCMethodCall : public CallEvent { 607b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose friend class CallEvent; 608740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 6098919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose const PseudoObjectExpr *getContainingPseudoObjectExpr() const; 610cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose 6118919e688dc610d1f632a4d43f7f1489f67255476Jordan Roseprotected: 6124b3918e9534e46f9ac067c6e0018f94613292efaJordan Rose void getExtraInvalidatedRegions(RegionList &Regions) const; 613740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 614740d490593e0de8732a697c9f77b90ddd463863bJordan Rose QualType getDeclaredResultType() const; 6159dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks ObjCMethodDecl *LookupClassMethodDefinition(Selector Sel, 6169dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks ObjCInterfaceDecl *ClassDecl) const; 617740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 618740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic: 6198919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose ObjCMethodCall(const ObjCMessageExpr *Msg, ProgramStateRef St, 6208919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose const LocationContext *LCtx) 6218919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose : CallEvent(Msg, St, LCtx, CE_ObjCMessage) { 6228919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose Data = 0; 623b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 624de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose 6258919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose const ObjCMessageExpr *getOriginExpr() const { 6268919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose return cast<ObjCMessageExpr>(CallEvent::getOriginExpr()); 627cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose } 628b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose const ObjCMethodDecl *getDecl() const { 629b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getMethodDecl(); 630b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 631b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose unsigned getNumArgs() const { 632b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getNumArgs(); 633b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 634b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose const Expr *getArgExpr(unsigned Index) const { 635b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getArg(Index); 636b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 637740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 6388919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose bool isInstanceMessage() const { 6398919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose return getOriginExpr()->isInstanceMessage(); 6408919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose } 6418919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose ObjCMethodFamily getMethodFamily() const { 6428919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose return getOriginExpr()->getMethodFamily(); 6438919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose } 6448919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose Selector getSelector() const { 6458919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose return getOriginExpr()->getSelector(); 6468919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose } 6478919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose 6488919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose SourceRange getSourceRange() const; 6498919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose 6500e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose /// \brief Returns the value of the receiver at the time of this call. 651740d490593e0de8732a697c9f77b90ddd463863bJordan Rose SVal getReceiverSVal() const; 652740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 6530e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose /// \brief Get the interface for the receiver. 6540e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose /// 6550e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose /// This works whether this is an instance message or a class message. 6560e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose /// However, it currently just uses the static type of the receiver. 657cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose const ObjCInterfaceDecl *getReceiverInterface() const { 658b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getReceiverInterface(); 659cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose } 660cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose 6618919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose ObjCMessageKind getMessageKind() const; 6628919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose 6638919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose bool isSetter() const { 6648919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose switch (getMessageKind()) { 6658919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose case OCM_Message: 6668919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose llvm_unreachable("This is not a pseudo-object access!"); 6678919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose case OCM_PropertyAccess: 6688919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose return getNumArgs() > 0; 6698919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose case OCM_Subscript: 6708919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose return getNumArgs() > 1; 6718919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose } 6728919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose llvm_unreachable("Unknown message kind"); 673740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 674740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 6759dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks // TODO: We might want to only compute this once (or change the API for 6769dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks // getting the parameters). Currently, this gets called 3 times during 6779dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks // inlining. 6789dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks const Decl *getRuntimeDefinition() const { 6798919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose 6809dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks const ObjCMessageExpr *E = getOriginExpr(); 6819dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks if (E->isInstanceMessage()) { 6829dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks return 0; 6839dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks } else { 6849dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks // This is a calss method. 6859dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks // If we have type info for the receiver class, we are calling via 6869dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks // class name. 6879dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks if (ObjCInterfaceDecl *IDecl = E->getReceiverInterface()) { 6889dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks return LookupClassMethodDefinition(E->getSelector(), IDecl); 6899dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks } 690ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose } 6919dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks 692ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose return 0; 693ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose } 694ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose 695b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose SVal getCXXThisVal() const { return UndefinedVal(); } 696b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 697b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose bool argumentsMayEscape() const { 698b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return hasNonZeroCallbackArg(); 699b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 700b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 701b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose SVal getArgSVal(unsigned Index) const { return getSVal(getArgExpr(Index)); } 702b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose SourceRange getArgSourceRange(unsigned Index) const { 703b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getArgExpr(Index)->getSourceRange(); 704b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 705b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 706b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose param_iterator param_begin(bool UseDefinitionParams = false) const; 707b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose param_iterator param_end(bool UseDefinitionParams = false) const; 708b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 709740d490593e0de8732a697c9f77b90ddd463863bJordan Rose static bool classof(const CallEvent *CA) { 710740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return CA->getKind() == CE_ObjCMessage; 711740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 712740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}; 713740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 714b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 715b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose// FIXME: Use a .def or .td file for this. 716b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose#define DISPATCH(fn) \ 717b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose switch (getKind()) { \ 718b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose case CE_Function: \ 719b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return cast<FunctionCall>(this)->fn(); \ 720b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose case CE_CXXMember: \ 721b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return cast<CXXMemberCall>(this)->fn(); \ 722b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose case CE_CXXMemberOperator: \ 723b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return cast<CXXMemberOperatorCall>(this)->fn(); \ 724b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose case CE_Block: \ 725b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return cast<BlockCall>(this)->fn(); \ 726b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose case CE_CXXConstructor: \ 727b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return cast<CXXConstructorCall>(this)->fn(); \ 728b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose case CE_CXXDestructor: \ 729b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return cast<CXXDestructorCall>(this)->fn(); \ 730b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose case CE_CXXAllocator: \ 731b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return cast<CXXAllocatorCall>(this)->fn(); \ 732b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose case CE_ObjCMessage: \ 7338919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose return cast<ObjCMethodCall>(this)->fn(); \ 7347dfbfb1835198bf0cb4b0caaa5d9f3c6301f9920Richard Smith } \ 7357dfbfb1835198bf0cb4b0caaa5d9f3c6301f9920Richard Smith llvm_unreachable("unknown CallEvent kind"); 736b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 737b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose#define DISPATCH_ARG(fn, arg) \ 738b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose switch (getKind()) { \ 739b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose case CE_Function: \ 740b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return cast<FunctionCall>(this)->fn(arg); \ 741b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose case CE_CXXMember: \ 742b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return cast<CXXMemberCall>(this)->fn(arg); \ 743b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose case CE_CXXMemberOperator: \ 744b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return cast<CXXMemberOperatorCall>(this)->fn(arg); \ 745b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose case CE_Block: \ 746b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return cast<BlockCall>(this)->fn(arg); \ 747b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose case CE_CXXConstructor: \ 748b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return cast<CXXConstructorCall>(this)->fn(arg); \ 749b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose case CE_CXXDestructor: \ 750b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return cast<CXXDestructorCall>(this)->fn(arg); \ 751b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose case CE_CXXAllocator: \ 752b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return cast<CXXAllocatorCall>(this)->fn(arg); \ 753b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose case CE_ObjCMessage: \ 7548919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose return cast<ObjCMethodCall>(this)->fn(arg); \ 7557dfbfb1835198bf0cb4b0caaa5d9f3c6301f9920Richard Smith } \ 7567dfbfb1835198bf0cb4b0caaa5d9f3c6301f9920Richard Smith llvm_unreachable("unknown CallEvent kind"); 757b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 7584b3918e9534e46f9ac067c6e0018f94613292efaJordan Roseinline void CallEvent::getExtraInvalidatedRegions(RegionList &Regions) const { 7594b3918e9534e46f9ac067c6e0018f94613292efaJordan Rose DISPATCH_ARG(getExtraInvalidatedRegions, Regions); 760b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose} 761b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 762b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseinline QualType CallEvent::getDeclaredResultType() const { 763b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose DISPATCH(getDeclaredResultType); 764b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose} 765b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 766b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseinline const Decl *CallEvent::getDecl() const { 767b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose if (const Decl *D = Origin.dyn_cast<const Decl *>()) 768b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return D; 769b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose DISPATCH(getDecl); 770b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose} 771b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 7729dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaksinline const Decl *CallEvent::getRuntimeDefinition() const { 7739dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks DISPATCH(getRuntimeDefinition); 774b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose} 775b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 776b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseinline unsigned CallEvent::getNumArgs() const { 777b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose DISPATCH(getNumArgs); 778b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose} 779b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 780b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseinline SourceRange CallEvent::getSourceRange() const { 781b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose DISPATCH(getSourceRange); 782b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose} 783b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 784b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseinline SVal CallEvent::getArgSVal(unsigned Index) const { 785b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose DISPATCH_ARG(getArgSVal, Index); 786b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose} 787b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 788b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseinline const Expr *CallEvent::getArgExpr(unsigned Index) const { 789b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose DISPATCH_ARG(getArgExpr, Index); 790b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose} 791b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 792b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseinline SourceRange CallEvent::getArgSourceRange(unsigned Index) const { 793b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose DISPATCH_ARG(getArgSourceRange, Index); 794b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose} 795b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 796b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseinline SVal CallEvent::getCXXThisVal() const { 797b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose DISPATCH(getCXXThisVal); 798b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose} 799b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 800b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 801b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseinline bool CallEvent::argumentsMayEscape() const { 802b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose DISPATCH(argumentsMayEscape); 803b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose} 804b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 805b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseinline CallEvent::param_iterator 806b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan RoseCallEvent::param_begin(bool UseDefinitionParams) const { 807b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose DISPATCH_ARG(param_begin, UseDefinitionParams); 808b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose} 809b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 810b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseinline CallEvent::param_iterator 811b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan RoseCallEvent::param_end(bool UseDefinitionParams) const { 812b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose DISPATCH_ARG(param_end, UseDefinitionParams); 813b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose} 814b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 815b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose#undef DISPATCH 816b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose#undef DISPATCH_ARG 817b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 818740d490593e0de8732a697c9f77b90ddd463863bJordan Rose} // end namespace ento 819740d490593e0de8732a697c9f77b90ddd463863bJordan Rose} // end namespace clang 820740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 821740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#endif 822