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 16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_CALLEVENT_H 17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_CALLEVENT_H 18740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 19740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/AST/DeclCXX.h" 20740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/AST/ExprCXX.h" 21740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/AST/ExprObjC.h" 22a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek#include "clang/Analysis/AnalysisContext.h" 2330a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/Basic/SourceManager.h" 24de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h" 25740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h" 26b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose#include "llvm/ADT/PointerIntPair.h" 274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include <utility> 28740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 29740d490593e0de8732a697c9f77b90ddd463863bJordan Rosenamespace clang { 3028038f33aa2db4833881fea757a1f0daf85ac02bJordan Roseclass ProgramPoint; 3128038f33aa2db4833881fea757a1f0daf85ac02bJordan Roseclass ProgramPointTag; 3228038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose 33740d490593e0de8732a697c9f77b90ddd463863bJordan Rosenamespace ento { 34740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 35740d490593e0de8732a697c9f77b90ddd463863bJordan Roseenum CallEventKind { 36740d490593e0de8732a697c9f77b90ddd463863bJordan Rose CE_Function, 37645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose CE_CXXMember, 38645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose CE_CXXMemberOperator, 398d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose CE_CXXDestructor, 40645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose CE_BEG_CXX_INSTANCE_CALLS = CE_CXXMember, 41645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose CE_END_CXX_INSTANCE_CALLS = CE_CXXDestructor, 42645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose CE_CXXConstructor, 4370cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose CE_CXXAllocator, 44740d490593e0de8732a697c9f77b90ddd463863bJordan Rose CE_BEG_FUNCTION_CALLS = CE_Function, 4570cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose CE_END_FUNCTION_CALLS = CE_CXXAllocator, 46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CE_Block, 478919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose CE_ObjCMessage 48740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}; 49740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 50972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseclass CallEvent; 51d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseclass CallEventManager; 52972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// This class represents a description of a function call using the number of 544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// arguments and the name of the function. 554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass CallDescription { 564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend CallEvent; 574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar mutable IdentifierInfo *II; 584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar StringRef FuncName; 594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned RequiredArgs; 604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic: 624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const static unsigned NoArgRequirement = ~0; 634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \brief Constructs a CallDescription object. 644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// 654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// @param FuncName The name of the function that will be matched. 664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// 674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// @param RequiredArgs The number of arguments that is expected to match a 684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// call. Omit this parameter to match every occurance of call with a given 694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// name regardless the number of arguments. 704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CallDescription(StringRef FuncName, unsigned RequiredArgs = NoArgRequirement) 714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : II(nullptr), FuncName(FuncName), RequiredArgs(RequiredArgs) {} 724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \brief Get the name of the function that this object matches. 744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar StringRef getFunctionName() const { return FuncName; } 754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}; 764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 77d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosetemplate<typename T = CallEvent> 78d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseclass CallEventRef : public IntrusiveRefCntPtr<const T> { 79d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosepublic: 80d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose CallEventRef(const T *Call) : IntrusiveRefCntPtr<const T>(Call) {} 81d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose CallEventRef(const CallEventRef &Orig) : IntrusiveRefCntPtr<const T>(Orig) {} 82d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 83d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose CallEventRef<T> cloneWithState(ProgramStateRef State) const { 84c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return this->get()->template cloneWithState<T>(State); 85d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose } 8657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose 8757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose // Allow implicit conversions to a superclass type, since CallEventRef 8857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose // behaves like a pointer-to-const. 8957c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose template <typename SuperT> 9057c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose operator CallEventRef<SuperT> () const { 91c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return this->get(); 9257c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose } 93d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose}; 94b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 951becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks/// \class RuntimeDefinition 965960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks/// \brief Defines the runtime definition of the called function. 971becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks/// 981becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks/// Encapsulates the information we have about which Decl will be used 991becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks/// when the call is executed on the given path. When dealing with dynamic 1001becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks/// dispatch, the information is based on DynamicTypeInfo and might not be 1011becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks/// precise. 102fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaksclass RuntimeDefinition { 1031becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks /// The Declaration of the function which could be called at runtime. 1041becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks /// NULL if not available. 105fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaks const Decl *D; 1065960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks 1075960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks /// The region representing an object (ObjC/C++) on which the method is 1085960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks /// called. With dynamic dispatch, the method definition depends on the 1091becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks /// runtime type of this object. NULL when the DynamicTypeInfo is 1101becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks /// precise. 111fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaks const MemRegion *R; 1125960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks 113fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zakspublic: 1146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines RuntimeDefinition(): D(nullptr), R(nullptr) {} 1156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines RuntimeDefinition(const Decl *InD): D(InD), R(nullptr) {} 116fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaks RuntimeDefinition(const Decl *InD, const MemRegion *InR): D(InD), R(InR) {} 1175960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks const Decl *getDecl() { return D; } 1181becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks 1191becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks /// \brief Check if the definition we have is precise. 1201becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks /// If not, it is possible that the call dispatches to another definition at 1211becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks /// execution time. 1226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool mayHaveOtherDefinitions() { return R != nullptr; } 1231becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks 1241becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks /// When other definitions are possible, returns the region whose runtime type 1251becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks /// determines the method definition. 1261becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks const MemRegion *getDispatchRegion() { return R; } 127e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks}; 128e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks 129740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents an abstract call to a function or method along a 130740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// particular path. 131972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// 132972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// CallEvents are created through the factory methods of CallEventManager. 133972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// 134972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// CallEvents should always be cheap to create and destroy. In order for 135972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// CallEventManager to be able to re-use CallEvent-sized memory blocks, 136972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// subclasses of CallEvent may not add any data members to the base class. 137972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// Use the "Data" and "Location" fields instead. 138740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass CallEvent { 139740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic: 140740d490593e0de8732a697c9f77b90ddd463863bJordan Rose typedef CallEventKind Kind; 141740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 142b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseprivate: 1437c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose ProgramStateRef State; 1447c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose const LocationContext *LCtx; 145b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose llvm::PointerUnion<const Expr *, const Decl *> Origin; 146b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 1470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines void operator=(const CallEvent &) = delete; 1487c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose 149740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected: 150b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose // This is user data for subclasses. 151b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose const void *Data; 152972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 153972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose // This is user data for subclasses. 154972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose // This should come right before RefCount, so that the two fields can be 155972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose // packed together on LP64 platforms. 156b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose SourceLocation Location; 157b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 158972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseprivate: 159972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose mutable unsigned RefCount; 160972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 161972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose template <typename T> friend struct llvm::IntrusiveRefCntPtrInfo; 162972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose void Retain() const { ++RefCount; } 163972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose void Release() const; 164972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 165972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseprotected: 166d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose friend class CallEventManager; 167d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 1685204d9e2fe0ea4e4b9c85087e355021c93221764Jordan Rose CallEvent(const Expr *E, ProgramStateRef state, const LocationContext *lctx) 1694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : State(std::move(state)), LCtx(lctx), Origin(E), RefCount(0) {} 170b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 1715204d9e2fe0ea4e4b9c85087e355021c93221764Jordan Rose CallEvent(const Decl *D, ProgramStateRef state, const LocationContext *lctx) 1724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : State(std::move(state)), LCtx(lctx), Origin(D), RefCount(0) {} 173972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 174972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose // DO NOT MAKE PUBLIC 175972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose CallEvent(const CallEvent &Original) 176972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose : State(Original.State), LCtx(Original.LCtx), Origin(Original.Origin), 177972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose Data(Original.Data), Location(Original.Location), RefCount(0) {} 178b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 179972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose /// Copies this CallEvent, with vtable intact, into a new block of memory. 180972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose virtual void cloneTo(void *Dest) const = 0; 181972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 182740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Get the value of arbitrary expressions at this point in the path. 183740d490593e0de8732a697c9f77b90ddd463863bJordan Rose SVal getSVal(const Stmt *S) const { 184b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getState()->getSVal(S, getLocationContext()); 185740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 186740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 187972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 188658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks typedef SmallVectorImpl<SVal> ValueList; 189740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 190740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Used to specify non-argument regions that will be invalidated as a 191740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// result of this call. 19287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar virtual void getExtraInvalidatedValues(ValueList &Values, 19387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RegionAndSymbolInvalidationTraits *ETraits) const {} 194740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 195740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic: 1967c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose virtual ~CallEvent() {} 1977c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose 198b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose /// \brief Returns the kind of call this is. 1997c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose virtual Kind getKind() const = 0; 200b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 201740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Returns the declaration of the function or method that will be 202740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// called. May be null. 2037c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose virtual const Decl *getDecl() const { 2047c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose return Origin.dyn_cast<const Decl *>(); 2057c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose } 206740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 2075a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks /// \brief The state in which the call is being evaluated. 2080a6e09f67c719c318856be19d57e19972101f62cJordan Rose const ProgramStateRef &getState() const { 2095a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks return State; 2105a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks } 2115a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks 2125a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks /// \brief The context in which the call is being evaluated. 2135a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks const LocationContext *getLocationContext() const { 2145a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks return LCtx; 2155a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks } 2165a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks 217ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose /// \brief Returns the definition of the function or method that will be 2185960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks /// called. 219ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek virtual RuntimeDefinition getRuntimeDefinition() const = 0; 220ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose 221740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Returns the expression whose value will be the result of this call. 222740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// May be null. 223b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose const Expr *getOriginExpr() const { 224b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return Origin.dyn_cast<const Expr *>(); 225b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 226740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 227740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Returns the number of arguments (explicit and implicit). 228740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// 229740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// Note that this may be greater than the number of parameters in the 230740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// callee's declaration, and that it may include arguments not written in 231740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// the source. 2327c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose virtual unsigned getNumArgs() const = 0; 233740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 234740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Returns true if the callee is known to be from a system header. 235740d490593e0de8732a697c9f77b90ddd463863bJordan Rose bool isInSystemHeader() const { 236740d490593e0de8732a697c9f77b90ddd463863bJordan Rose const Decl *D = getDecl(); 237740d490593e0de8732a697c9f77b90ddd463863bJordan Rose if (!D) 238740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return false; 239740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 240740d490593e0de8732a697c9f77b90ddd463863bJordan Rose SourceLocation Loc = D->getLocation(); 241740d490593e0de8732a697c9f77b90ddd463863bJordan Rose if (Loc.isValid()) { 242740d490593e0de8732a697c9f77b90ddd463863bJordan Rose const SourceManager &SM = 243b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose getState()->getStateManager().getContext().getSourceManager(); 244740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return SM.isInSystemHeader(D->getLocation()); 245740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 246740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 247740d490593e0de8732a697c9f77b90ddd463863bJordan Rose // Special case for implicitly-declared global operator new/delete. 248740d490593e0de8732a697c9f77b90ddd463863bJordan Rose // These should be considered system functions. 249740d490593e0de8732a697c9f77b90ddd463863bJordan Rose if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) 250740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return FD->isOverloadedOperator() && FD->isImplicit() && FD->isGlobal(); 251740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 252740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return false; 253740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 254740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 2554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \brief Returns true if the CallEvent is a call to a function that matches 2564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// the CallDescription. 2574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// 2584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// Note that this function is not intended to be used to match Obj-C method 2594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// calls. 2604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool isCalled(const CallDescription &CD) const; 2614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 262de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose /// \brief Returns a source range for the entire call, suitable for 263de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose /// outputting in diagnostics. 2647c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose virtual SourceRange getSourceRange() const { 2657c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose return getOriginExpr()->getSourceRange(); 2667c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose } 267de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose 268740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Returns the value of a given argument at the time of the call. 2697c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose virtual SVal getArgSVal(unsigned Index) const; 270740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 271740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Returns the expression associated with a given argument. 272740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// May be null if this expression does not appear in the source. 2736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines virtual const Expr *getArgExpr(unsigned Index) const { return nullptr; } 274740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 275740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Returns the source range for errors associated with this argument. 2767c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose /// 277740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// May be invalid if the argument is not written in the source. 2787c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose virtual SourceRange getArgSourceRange(unsigned Index) const; 279740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 280740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Returns the result type, adjusted for references. 281740d490593e0de8732a697c9f77b90ddd463863bJordan Rose QualType getResultType() const; 282740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 2832f3017f9cbd3774f690c979410bfec38423d03afJordan Rose /// \brief Returns the return value of the call. 2842f3017f9cbd3774f690c979410bfec38423d03afJordan Rose /// 2852f3017f9cbd3774f690c979410bfec38423d03afJordan Rose /// This should only be called if the CallEvent was created using a state in 2862f3017f9cbd3774f690c979410bfec38423d03afJordan Rose /// which the return value has already been bound to the origin expression. 2872f3017f9cbd3774f690c979410bfec38423d03afJordan Rose SVal getReturnValue() const; 2882f3017f9cbd3774f690c979410bfec38423d03afJordan Rose 28987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// \brief Returns true if the type of any of the non-null arguments satisfies 29087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// the condition. 29187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool hasNonNullArgumentsWithType(bool (*Condition)(QualType)) const; 29287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 293740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Returns true if any of the arguments appear to represent callbacks. 294740d490593e0de8732a697c9f77b90ddd463863bJordan Rose bool hasNonZeroCallbackArg() const; 295740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 29687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// \brief Returns true if any of the arguments is void*. 29787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool hasVoidPointerToNonConstArg() const; 29887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 29985d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose /// \brief Returns true if any of the arguments are known to escape to long- 30085d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose /// term storage, even if this method will not modify them. 30185d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose // NOTE: The exact semantics of this are still being defined! 30285d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose // We don't really want a list of hardcoded exceptions in the long run, 30385d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose // but we don't want duplicated lists of known APIs in the short term either. 3047c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose virtual bool argumentsMayEscape() const { 3057c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose return hasNonZeroCallbackArg(); 3067c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose } 30785d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose 3082f3017f9cbd3774f690c979410bfec38423d03afJordan Rose /// \brief Returns true if the callee is an externally-visible function in the 3092f3017f9cbd3774f690c979410bfec38423d03afJordan Rose /// top-level namespace, such as \c malloc. 3102f3017f9cbd3774f690c979410bfec38423d03afJordan Rose /// 3112f3017f9cbd3774f690c979410bfec38423d03afJordan Rose /// You can use this call to determine that a particular function really is 3122f3017f9cbd3774f690c979410bfec38423d03afJordan Rose /// a library function and not, say, a C++ member function with the same name. 3132f3017f9cbd3774f690c979410bfec38423d03afJordan Rose /// 3142f3017f9cbd3774f690c979410bfec38423d03afJordan Rose /// If a name is provided, the function must additionally match the given 3152f3017f9cbd3774f690c979410bfec38423d03afJordan Rose /// name. 3162f3017f9cbd3774f690c979410bfec38423d03afJordan Rose /// 3172f3017f9cbd3774f690c979410bfec38423d03afJordan Rose /// Note that this deliberately excludes C++ library functions in the \c std 3182f3017f9cbd3774f690c979410bfec38423d03afJordan Rose /// namespace, but will include C library functions accessed through the 3192f3017f9cbd3774f690c979410bfec38423d03afJordan Rose /// \c std namespace. This also does not check if the function is declared 3202f3017f9cbd3774f690c979410bfec38423d03afJordan Rose /// as 'extern "C"', or if it uses C++ name mangling. 3212f3017f9cbd3774f690c979410bfec38423d03afJordan Rose // FIXME: Add a helper for checking namespaces. 3222f3017f9cbd3774f690c979410bfec38423d03afJordan Rose // FIXME: Move this down to AnyFunctionCall once checkers have more 3232f3017f9cbd3774f690c979410bfec38423d03afJordan Rose // precise callbacks. 3242f3017f9cbd3774f690c979410bfec38423d03afJordan Rose bool isGlobalCFunction(StringRef SpecificName = StringRef()) const; 3252f3017f9cbd3774f690c979410bfec38423d03afJordan Rose 3262f3017f9cbd3774f690c979410bfec38423d03afJordan Rose /// \brief Returns the name of the callee, if its name is a simple identifier. 3272f3017f9cbd3774f690c979410bfec38423d03afJordan Rose /// 3282f3017f9cbd3774f690c979410bfec38423d03afJordan Rose /// Note that this will fail for Objective-C methods, blocks, and C++ 3292f3017f9cbd3774f690c979410bfec38423d03afJordan Rose /// overloaded operators. The former is named by a Selector rather than a 3302f3017f9cbd3774f690c979410bfec38423d03afJordan Rose /// simple identifier, and the latter two do not have names. 3312f3017f9cbd3774f690c979410bfec38423d03afJordan Rose // FIXME: Move this down to AnyFunctionCall once checkers have more 3322f3017f9cbd3774f690c979410bfec38423d03afJordan Rose // precise callbacks. 3332f3017f9cbd3774f690c979410bfec38423d03afJordan Rose const IdentifierInfo *getCalleeIdentifier() const { 3342f3017f9cbd3774f690c979410bfec38423d03afJordan Rose const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(getDecl()); 3352f3017f9cbd3774f690c979410bfec38423d03afJordan Rose if (!ND) 3366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3372f3017f9cbd3774f690c979410bfec38423d03afJordan Rose return ND->getIdentifier(); 3382f3017f9cbd3774f690c979410bfec38423d03afJordan Rose } 3392f3017f9cbd3774f690c979410bfec38423d03afJordan Rose 34028038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose /// \brief Returns an appropriate ProgramPoint for this call. 3418d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose ProgramPoint getProgramPoint(bool IsPreVisit = false, 3426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const ProgramPointTag *Tag = nullptr) const; 34328038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose 344740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// \brief Returns a new state with all argument regions invalidated. 345740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// 346740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// This accepts an alternate state in case some processing has already 347740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /// occurred. 348740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ProgramStateRef invalidateRegions(unsigned BlockCount, 3496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ProgramStateRef Orig = nullptr) const; 350740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 351ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose typedef std::pair<Loc, SVal> FrameBindingTy; 352ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose typedef SmallVectorImpl<FrameBindingTy> BindingsTy; 353ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose 354ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose /// Populates the given SmallVector with the bindings in the callee's stack 355ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose /// frame at the start of this call. 356ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, 357ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose BindingsTy &Bindings) const = 0; 358ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose 359972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose /// Returns a copy of this CallEvent, but using the given state. 360972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose template <typename T> 361d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose CallEventRef<T> cloneWithState(ProgramStateRef NewState) const; 362972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 363972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose /// Returns a copy of this CallEvent, but using the given state. 364d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose CallEventRef<> cloneWithState(ProgramStateRef NewState) const { 365972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose return cloneWithState<CallEvent>(NewState); 366972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose } 367972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 3686062334cc388bce69fb3978c4ecb26c6485a5c2bJordan Rose /// \brief Returns true if this is a statement is a function or method call 3696062334cc388bce69fb3978c4ecb26c6485a5c2bJordan Rose /// of some kind. 3706062334cc388bce69fb3978c4ecb26c6485a5c2bJordan Rose static bool isCallStmt(const Stmt *S); 37185d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose 372962fbc46664f2486d6805549130fa6b310de6d60Jordan Rose /// \brief Returns the result type of a function or method declaration. 373962fbc46664f2486d6805549130fa6b310de6d60Jordan Rose /// 374962fbc46664f2486d6805549130fa6b310de6d60Jordan Rose /// This will return a null QualType if the result type cannot be determined. 37516e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaks static QualType getDeclaredResultType(const Decl *D); 37616e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaks 3779b072b31ee2f41b8e30d1d22142c9ab72ac5ff1fJordan Rose /// \brief Returns true if the given decl is known to be variadic. 3789b072b31ee2f41b8e30d1d22142c9ab72ac5ff1fJordan Rose /// 3799b072b31ee2f41b8e30d1d22142c9ab72ac5ff1fJordan Rose /// \p D must not be null. 3809b072b31ee2f41b8e30d1d22142c9ab72ac5ff1fJordan Rose static bool isVariadic(const Decl *D); 3819b072b31ee2f41b8e30d1d22142c9ab72ac5ff1fJordan Rose 382e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose // Iterator access to formal parameters and their types. 383740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprivate: 384740d490593e0de8732a697c9f77b90ddd463863bJordan Rose typedef std::const_mem_fun_t<QualType, ParmVarDecl> get_type_fun; 385e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose 386651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic: 387651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// Return call's formal parameters. 388e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// 389e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// Remember that the number of formal parameters may not match the number 390e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// of arguments for all calls. However, the first parameter will always 391e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// correspond with the argument value returned by \c getArgSVal(0). 392651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual ArrayRef<ParmVarDecl*> parameters() const = 0; 393e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose 394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef llvm::mapped_iterator<ArrayRef<ParmVarDecl*>::iterator, get_type_fun> 395740d490593e0de8732a697c9f77b90ddd463863bJordan Rose param_type_iterator; 396740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 397e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// Returns an iterator over the types of the call's formal parameters. 398e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// 399e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// This uses the callee decl found by default name lookup rather than the 400e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// definition because it represents a public interface, and probably has 401e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// more annotations. 402740d490593e0de8732a697c9f77b90ddd463863bJordan Rose param_type_iterator param_type_begin() const { 403651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return llvm::map_iterator(parameters().begin(), 404740d490593e0de8732a697c9f77b90ddd463863bJordan Rose get_type_fun(&ParmVarDecl::getType)); 405740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 406e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /// \sa param_type_begin() 407740d490593e0de8732a697c9f77b90ddd463863bJordan Rose param_type_iterator param_type_end() const { 408651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return llvm::map_iterator(parameters().end(), 409651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines get_type_fun(&ParmVarDecl::getType)); 410740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 411740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 4120ffbfd1a7f80f9a3c07317cb8f44c562f2ba1ba5Jordan Rose // For debugging purposes only 413b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose void dump(raw_ostream &Out) const; 414651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dump() const; 415740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}; 416740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 417b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 418740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a call to any sort of function that might have a 419740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// FunctionDecl. 420740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass AnyFunctionCall : public CallEvent { 421740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected: 422b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose AnyFunctionCall(const Expr *E, ProgramStateRef St, 4237c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose const LocationContext *LCtx) 4247c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose : CallEvent(E, St, LCtx) {} 425b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose AnyFunctionCall(const Decl *D, ProgramStateRef St, 4267c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose const LocationContext *LCtx) 4277c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose : CallEvent(D, St, LCtx) {} 428972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose AnyFunctionCall(const AnyFunctionCall &Other) : CallEvent(Other) {} 429740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 430740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic: 431b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose // This function is overridden by subclasses, but they must return 432b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose // a FunctionDecl. 433651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const FunctionDecl *getDecl() const override { 4347c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose return cast<FunctionDecl>(CallEvent::getDecl()); 435b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 436740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 437651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines RuntimeDefinition getRuntimeDefinition() const override { 438ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose const FunctionDecl *FD = getDecl(); 439a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek // Note that the AnalysisDeclContext will have the FunctionDecl with 440a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek // the definition (if one exists). 441a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek if (FD) { 442ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek AnalysisDeclContext *AD = 443ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek getLocationContext()->getAnalysisDeclContext()-> 444ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek getManager()->getContext(FD); 445a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek if (AD->getBody()) 446a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek return RuntimeDefinition(AD->getDecl()); 447a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek } 448a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek 449e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks return RuntimeDefinition(); 450ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose } 451ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose 452651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool argumentsMayEscape() const override; 453b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 454651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, 455651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines BindingsTy &Bindings) const override; 456ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose 457651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ArrayRef<ParmVarDecl *> parameters() const override; 458b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 459740d490593e0de8732a697c9f77b90ddd463863bJordan Rose static bool classof(const CallEvent *CA) { 460740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return CA->getKind() >= CE_BEG_FUNCTION_CALLS && 461740d490593e0de8732a697c9f77b90ddd463863bJordan Rose CA->getKind() <= CE_END_FUNCTION_CALLS; 462740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 463740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}; 464740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 465651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \brief Represents a C function or static C++ member function call. 466651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// 467651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// Example: \c fun() 468651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass SimpleFunctionCall : public AnyFunctionCall { 469651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines friend class CallEventManager; 470651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 471740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected: 472651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SimpleFunctionCall(const CallExpr *CE, ProgramStateRef St, 473651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const LocationContext *LCtx) 474972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose : AnyFunctionCall(CE, St, LCtx) {} 475651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SimpleFunctionCall(const SimpleFunctionCall &Other) 476651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : AnyFunctionCall(Other) {} 477651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void cloneTo(void *Dest) const override { 478651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines new (Dest) SimpleFunctionCall(*this); 479651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 480740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 481740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic: 4827c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose virtual const CallExpr *getOriginExpr() const { 483b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return cast<CallExpr>(AnyFunctionCall::getOriginExpr()); 484b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 485740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 486651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const FunctionDecl *getDecl() const override; 487740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 488651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned getNumArgs() const override { return getOriginExpr()->getNumArgs(); } 4897c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose 490651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Expr *getArgExpr(unsigned Index) const override { 491b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getArg(Index); 492740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 493740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 494651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Kind getKind() const override { return CE_Function; } 495b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 496740d490593e0de8732a697c9f77b90ddd463863bJordan Rose static bool classof(const CallEvent *CA) { 497740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return CA->getKind() == CE_Function; 498740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 499740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}; 500740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 501645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// \brief Represents a call to a block. 502645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// 503645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// Example: <tt>^{ /* ... */ }()</tt> 504651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass BlockCall : public CallEvent { 505645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose friend class CallEventManager; 506645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 507645baeed6800f952e9ad1d5666e01080385531a2Jordan Roseprotected: 508645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose BlockCall(const CallExpr *CE, ProgramStateRef St, 509645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose const LocationContext *LCtx) 510651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : CallEvent(CE, St, LCtx) {} 511645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 512651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines BlockCall(const BlockCall &Other) : CallEvent(Other) {} 513651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void cloneTo(void *Dest) const override { new (Dest) BlockCall(*this); } 514645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 51587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar void getExtraInvalidatedValues(ValueList &Values, 51687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RegionAndSymbolInvalidationTraits *ETraits) const override; 517645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 518645baeed6800f952e9ad1d5666e01080385531a2Jordan Rosepublic: 519651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual const CallExpr *getOriginExpr() const { 520651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return cast<CallExpr>(CallEvent::getOriginExpr()); 521651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 522651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 523651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned getNumArgs() const override { return getOriginExpr()->getNumArgs(); } 524651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 525651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Expr *getArgExpr(unsigned Index) const override { 526651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return getOriginExpr()->getArg(Index); 527651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 528651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 529645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose /// \brief Returns the region associated with this instance of the block. 530645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose /// 531645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose /// This may be NULL if the block's origin is unknown. 532645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose const BlockDataRegion *getBlockRegion() const; 533645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 534651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const BlockDecl *getDecl() const override { 535645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose const BlockDataRegion *BR = getBlockRegion(); 536645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose if (!BR) 5376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 538645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose return BR->getDecl(); 539645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose } 540645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 54187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool isConversionFromLambda() const { 54287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const BlockDecl *BD = getDecl(); 54387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!BD) 54487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return false; 54587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 54687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return BD->isConversionFromLambda(); 54787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 54887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 54987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// \brief For a block converted from a C++ lambda, returns the block 55087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// VarRegion for the variable holding the captured C++ lambda record. 55187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const VarRegion *getRegionStoringCapturedLambda() const { 55287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(isConversionFromLambda()); 55387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const BlockDataRegion *BR = getBlockRegion(); 55487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(BR && "Block converted from lambda must have a block region"); 55587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 55687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto I = BR->referenced_vars_begin(); 55787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(I != BR->referenced_vars_end()); 55887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 55987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return I.getCapturedRegion(); 56087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 56187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 562651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines RuntimeDefinition getRuntimeDefinition() const override { 56387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!isConversionFromLambda()) 56487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return RuntimeDefinition(getDecl()); 56587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 56687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Clang converts lambdas to blocks with an implicit user-defined 56787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // conversion operator method on the lambda record that looks (roughly) 56887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // like: 56987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // 57087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // typedef R(^block_type)(P1, P2, ...); 57187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // operator block_type() const { 57287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // auto Lambda = *this; 57387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // return ^(P1 p1, P2 p2, ...){ 57487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // /* return Lambda(p1, p2, ...); */ 57587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // }; 57687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // } 57787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // 57887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Here R is the return type of the lambda and P1, P2, ... are 57987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // its parameter types. 'Lambda' is a fake VarDecl captured by the block 58087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // that is initialized to a copy of the lambda. 58187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // 58287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Sema leaves the body of a lambda-converted block empty (it is 58387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // produced by CodeGen), so we can't analyze it directly. Instead, we skip 58487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // the block body and analyze the operator() method on the captured lambda. 58587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const VarDecl *LambdaVD = getRegionStoringCapturedLambda()->getDecl(); 58687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const CXXRecordDecl *LambdaDecl = LambdaVD->getType()->getAsCXXRecordDecl(); 58787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CXXMethodDecl* LambdaCallOperator = LambdaDecl->getLambdaCallOperator(); 58887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 58987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return RuntimeDefinition(LambdaCallOperator); 590645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose } 591645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 592651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool argumentsMayEscape() const override { 593651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 594651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 595645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 596651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, 597651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines BindingsTy &Bindings) const override; 598645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 599651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ArrayRef<ParmVarDecl*> parameters() const override; 600651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 601651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Kind getKind() const override { return CE_Block; } 602645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 603645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose static bool classof(const CallEvent *CA) { 604645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose return CA->getKind() == CE_Block; 605645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose } 606645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose}; 607645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 608c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// \brief Represents a non-static C++ member function call, no matter how 609c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// it is written. 610645baeed6800f952e9ad1d5666e01080385531a2Jordan Roseclass CXXInstanceCall : public AnyFunctionCall { 611740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected: 61287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar void getExtraInvalidatedValues(ValueList &Values, 61387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RegionAndSymbolInvalidationTraits *ETraits) const override; 614740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 615c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose CXXInstanceCall(const CallExpr *CE, ProgramStateRef St, 6167c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose const LocationContext *LCtx) 617645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose : AnyFunctionCall(CE, St, LCtx) {} 618645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose CXXInstanceCall(const FunctionDecl *D, ProgramStateRef St, 619645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose const LocationContext *LCtx) 620645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose : AnyFunctionCall(D, St, LCtx) {} 621645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 622c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose 623645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose CXXInstanceCall(const CXXInstanceCall &Other) : AnyFunctionCall(Other) {} 624972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 625c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rosepublic: 6269da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose /// \brief Returns the expression representing the implicit 'this' object. 6276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines virtual const Expr *getCXXThisExpr() const { return nullptr; } 6289da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose 629ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose /// \brief Returns the value of the implicit 'this' object. 6306ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose virtual SVal getCXXThisVal() const; 631ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose 632651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const FunctionDecl *getDecl() const override; 633645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 634651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines RuntimeDefinition getRuntimeDefinition() const override; 635c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose 636651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, 637651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines BindingsTy &Bindings) const override; 638ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose 639c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose static bool classof(const CallEvent *CA) { 640c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose return CA->getKind() >= CE_BEG_CXX_INSTANCE_CALLS && 641c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose CA->getKind() <= CE_END_CXX_INSTANCE_CALLS; 642c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose } 643c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose}; 644c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose 645c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// \brief Represents a non-static C++ member function call. 646c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// 647c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// Example: \c obj.fun() 648c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Roseclass CXXMemberCall : public CXXInstanceCall { 649d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose friend class CallEventManager; 650972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 651d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseprotected: 652740d490593e0de8732a697c9f77b90ddd463863bJordan Rose CXXMemberCall(const CXXMemberCallExpr *CE, ProgramStateRef St, 653c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose const LocationContext *LCtx) 6547c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose : CXXInstanceCall(CE, St, LCtx) {} 655740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 656d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose CXXMemberCall(const CXXMemberCall &Other) : CXXInstanceCall(Other) {} 657651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void cloneTo(void *Dest) const override { new (Dest) CXXMemberCall(*this); } 658d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 659d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosepublic: 6607c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose virtual const CXXMemberCallExpr *getOriginExpr() const { 661645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose return cast<CXXMemberCallExpr>(CXXInstanceCall::getOriginExpr()); 662645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose } 663645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 664651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned getNumArgs() const override { 665645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose if (const CallExpr *CE = getOriginExpr()) 666645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose return CE->getNumArgs(); 667645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose return 0; 668645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose } 669645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 670651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Expr *getArgExpr(unsigned Index) const override { 671645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose return getOriginExpr()->getArg(Index); 672740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 673740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 674651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Expr *getCXXThisExpr() const override; 6757c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose 676651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines RuntimeDefinition getRuntimeDefinition() const override; 677651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 678651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Kind getKind() const override { return CE_CXXMember; } 679e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose 680740d490593e0de8732a697c9f77b90ddd463863bJordan Rose static bool classof(const CallEvent *CA) { 681740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return CA->getKind() == CE_CXXMember; 682740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 683740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}; 684740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 685fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// \brief Represents a C++ overloaded operator call where the operator is 686fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// implemented as a non-static member function. 687fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// 688fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// Example: <tt>iter + 1</tt> 689c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Roseclass CXXMemberOperatorCall : public CXXInstanceCall { 690d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose friend class CallEventManager; 691d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 692972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseprotected: 693d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose CXXMemberOperatorCall(const CXXOperatorCallExpr *CE, ProgramStateRef St, 694d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose const LocationContext *LCtx) 695d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose : CXXInstanceCall(CE, St, LCtx) {} 696d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 697972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose CXXMemberOperatorCall(const CXXMemberOperatorCall &Other) 698972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose : CXXInstanceCall(Other) {} 699651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void cloneTo(void *Dest) const override { 700972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose new (Dest) CXXMemberOperatorCall(*this); 701972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose } 702972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 703fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rosepublic: 7047c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose virtual const CXXOperatorCallExpr *getOriginExpr() const { 705645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose return cast<CXXOperatorCallExpr>(CXXInstanceCall::getOriginExpr()); 706fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose } 707fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose 708651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned getNumArgs() const override { 7097c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose return getOriginExpr()->getNumArgs() - 1; 7107c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose } 711651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Expr *getArgExpr(unsigned Index) const override { 712fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose return getOriginExpr()->getArg(Index + 1); 713fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose } 714fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose 715651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Expr *getCXXThisExpr() const override; 7167c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose 717651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Kind getKind() const override { return CE_CXXMemberOperator; } 718e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose 719fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose static bool classof(const CallEvent *CA) { 720fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose return CA->getKind() == CE_CXXMemberOperator; 721fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose } 722fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose}; 723fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose 724645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// \brief Represents an implicit call to a C++ destructor. 725740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// 726645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// This can occur at the end of a scope (for automatic objects), at the end 727645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// of a full-expression (for temporaries), or as part of a delete. 728645baeed6800f952e9ad1d5666e01080385531a2Jordan Roseclass CXXDestructorCall : public CXXInstanceCall { 729d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose friend class CallEventManager; 730d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 731740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected: 732200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose typedef llvm::PointerIntPair<const MemRegion *, 1, bool> DtorDataTy; 733200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose 734645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose /// Creates an implicit destructor. 73569f87c956b3ac2b80124fd9604af012e1061473aJordan Rose /// 736645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose /// \param DD The destructor that will be called. 737645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose /// \param Trigger The statement whose completion causes this destructor call. 738645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose /// \param Target The object region to be destructed. 739645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose /// \param St The path-sensitive state at this point in the program. 740645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose /// \param LCtx The location context at this point in the program. 741645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose CXXDestructorCall(const CXXDestructorDecl *DD, const Stmt *Trigger, 742200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose const MemRegion *Target, bool IsBaseDestructor, 743200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose ProgramStateRef St, const LocationContext *LCtx) 744645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose : CXXInstanceCall(DD, St, LCtx) { 745200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose Data = DtorDataTy(Target, IsBaseDestructor).getOpaqueValue(); 746645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose Location = Trigger->getLocEnd(); 747740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 748740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 749645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose CXXDestructorCall(const CXXDestructorCall &Other) : CXXInstanceCall(Other) {} 750651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void cloneTo(void *Dest) const override {new (Dest) CXXDestructorCall(*this);} 751ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose 752645baeed6800f952e9ad1d5666e01080385531a2Jordan Rosepublic: 753651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceRange getSourceRange() const override { return Location; } 754651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned getNumArgs() const override { return 0; } 755ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose 756651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines RuntimeDefinition getRuntimeDefinition() const override; 757200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose 758645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose /// \brief Returns the value of the implicit 'this' object. 759651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SVal getCXXThisVal() const override; 760b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 761200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose /// Returns true if this is a call to a base class destructor. 762200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose bool isBaseDestructor() const { 763200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose return DtorDataTy::getFromOpaqueValue(Data).getInt(); 764200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose } 765200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose 766651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Kind getKind() const override { return CE_CXXDestructor; } 767b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 768740d490593e0de8732a697c9f77b90ddd463863bJordan Rose static bool classof(const CallEvent *CA) { 769645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose return CA->getKind() == CE_CXXDestructor; 770740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 771740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}; 772740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 773740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a call to a C++ constructor. 774740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// 775740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// Example: \c T(1) 776740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass CXXConstructorCall : public AnyFunctionCall { 777d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose friend class CallEventManager; 778b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 779d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseprotected: 780d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose /// Creates a constructor call. 781d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose /// 782d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose /// \param CE The constructor expression as written in the source. 783d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose /// \param Target The region where the object should be constructed. If NULL, 784d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose /// a new symbolic region will be used. 785d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose /// \param St The path-sensitive state at this point in the program. 786d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose /// \param LCtx The location context at this point in the program. 78770517ca5c07c4b41ff8662b94ee22047b0299f8cDmitri Gribenko CXXConstructorCall(const CXXConstructExpr *CE, const MemRegion *Target, 788740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ProgramStateRef St, const LocationContext *LCtx) 7897c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose : AnyFunctionCall(CE, St, LCtx) { 79070517ca5c07c4b41ff8662b94ee22047b0299f8cDmitri Gribenko Data = Target; 791b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 792740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 793d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose CXXConstructorCall(const CXXConstructorCall &Other) : AnyFunctionCall(Other){} 794651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void cloneTo(void *Dest) const override { new (Dest) CXXConstructorCall(*this); } 795d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 79687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar void getExtraInvalidatedValues(ValueList &Values, 79787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RegionAndSymbolInvalidationTraits *ETraits) const override; 798d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 799d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosepublic: 8007c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose virtual const CXXConstructExpr *getOriginExpr() const { 801b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return cast<CXXConstructExpr>(AnyFunctionCall::getOriginExpr()); 802b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 803b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 804651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const CXXConstructorDecl *getDecl() const override { 805b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getConstructor(); 806740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 807740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 808651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned getNumArgs() const override { return getOriginExpr()->getNumArgs(); } 809740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 810651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Expr *getArgExpr(unsigned Index) const override { 811b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getArg(Index); 812740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 813740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 814ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose /// \brief Returns the value of the implicit 'this' object. 815645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose SVal getCXXThisVal() const; 8167c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose 817651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, 818651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines BindingsTy &Bindings) const override; 819ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose 820651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Kind getKind() const override { return CE_CXXConstructor; } 821e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose 822740d490593e0de8732a697c9f77b90ddd463863bJordan Rose static bool classof(const CallEvent *CA) { 823740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return CA->getKind() == CE_CXXConstructor; 824740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 825740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}; 826740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 8270e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose/// \brief Represents the memory allocation call in a C++ new-expression. 8280e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose/// 8290e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose/// This is a call to "operator new". 83070cbf3cc09eb21db1108396d30a414ea66d842ccJordan Roseclass CXXAllocatorCall : public AnyFunctionCall { 831d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose friend class CallEventManager; 832972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 833d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseprotected: 834b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose CXXAllocatorCall(const CXXNewExpr *E, ProgramStateRef St, 83570cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose const LocationContext *LCtx) 8367c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose : AnyFunctionCall(E, St, LCtx) {} 83770cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose 838d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose CXXAllocatorCall(const CXXAllocatorCall &Other) : AnyFunctionCall(Other) {} 839651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void cloneTo(void *Dest) const override { new (Dest) CXXAllocatorCall(*this); } 840d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 841d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosepublic: 8427c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose virtual const CXXNewExpr *getOriginExpr() const { 843b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return cast<CXXNewExpr>(AnyFunctionCall::getOriginExpr()); 844b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 845b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 846651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const FunctionDecl *getDecl() const override { 847b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getOperatorNew(); 84870cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose } 84970cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose 850651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned getNumArgs() const override { 851b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getNumPlacementArgs() + 1; 852b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 85370cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose 854651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Expr *getArgExpr(unsigned Index) const override { 85570cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose // The first argument of an allocator call is the size of the allocation. 85670cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose if (Index == 0) 8576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 858b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getPlacementArg(Index - 1); 85970cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose } 86070cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose 861651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Kind getKind() const override { return CE_CXXAllocator; } 862b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 86370cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose static bool classof(const CallEvent *CE) { 86470cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose return CE->getKind() == CE_CXXAllocator; 86570cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose } 86670cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose}; 86770cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose 8688919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose/// \brief Represents the ways an Objective-C message send can occur. 8698919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose// 8708919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose// Note to maintainers: OCM_Message should always be last, since it does not 8718919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose// need to fit in the Data field's low bits. 8728919e688dc610d1f632a4d43f7f1489f67255476Jordan Roseenum ObjCMessageKind { 8738919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose OCM_PropertyAccess, 8748919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose OCM_Subscript, 8758919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose OCM_Message 8768919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose}; 8778919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose 878cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose/// \brief Represents any expression that calls an Objective-C method. 8798919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose/// 8808919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose/// This includes all of the kinds listed in ObjCMessageKind. 881cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Roseclass ObjCMethodCall : public CallEvent { 882d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose friend class CallEventManager; 883d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 8848919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose const PseudoObjectExpr *getContainingPseudoObjectExpr() const; 885cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose 8868919e688dc610d1f632a4d43f7f1489f67255476Jordan Roseprotected: 887d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose ObjCMethodCall(const ObjCMessageExpr *Msg, ProgramStateRef St, 888d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose const LocationContext *LCtx) 889d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose : CallEvent(Msg, St, LCtx) { 8906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Data = nullptr; 891d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose } 892d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 893972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose ObjCMethodCall(const ObjCMethodCall &Other) : CallEvent(Other) {} 894651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void cloneTo(void *Dest) const override { new (Dest) ObjCMethodCall(*this); } 895972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 89687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar void getExtraInvalidatedValues(ValueList &Values, 89787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RegionAndSymbolInvalidationTraits *ETraits) const override; 898740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 8993f558af01643787d209a133215b0abec81b5fe30Anna Zaks /// Check if the selector may have multiple definitions (may have overrides). 9003f558af01643787d209a133215b0abec81b5fe30Anna Zaks virtual bool canBeOverridenInSubclass(ObjCInterfaceDecl *IDecl, 9013f558af01643787d209a133215b0abec81b5fe30Anna Zaks Selector Sel) const; 9023f558af01643787d209a133215b0abec81b5fe30Anna Zaks 903740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic: 9047c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose virtual const ObjCMessageExpr *getOriginExpr() const { 9058919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose return cast<ObjCMessageExpr>(CallEvent::getOriginExpr()); 906cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose } 907651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const ObjCMethodDecl *getDecl() const override { 908b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getMethodDecl(); 909b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 910651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned getNumArgs() const override { 911b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getNumArgs(); 912b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 913651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Expr *getArgExpr(unsigned Index) const override { 914b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getArg(Index); 915b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 916740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 9178919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose bool isInstanceMessage() const { 9188919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose return getOriginExpr()->isInstanceMessage(); 9198919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose } 9208919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose ObjCMethodFamily getMethodFamily() const { 9218919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose return getOriginExpr()->getMethodFamily(); 9228919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose } 9238919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose Selector getSelector() const { 9248919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose return getOriginExpr()->getSelector(); 9258919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose } 9268919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose 927651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceRange getSourceRange() const override; 9288919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose 9290e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose /// \brief Returns the value of the receiver at the time of this call. 930740d490593e0de8732a697c9f77b90ddd463863bJordan Rose SVal getReceiverSVal() const; 931740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 9325a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks /// \brief Return the value of 'self' if available. 9335a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks SVal getSelfSVal() const; 9345a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks 9350e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose /// \brief Get the interface for the receiver. 9360e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose /// 9370e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose /// This works whether this is an instance message or a class message. 9380e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose /// However, it currently just uses the static type of the receiver. 939cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose const ObjCInterfaceDecl *getReceiverInterface() const { 940b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return getOriginExpr()->getReceiverInterface(); 941cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose } 942cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose 9435a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks /// \brief Checks if the receiver refers to 'self' or 'super'. 9445a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks bool isReceiverSelfOrSuper() const; 9455a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks 94609647f28d7955d0c948ebbbb376a46844056f11aJordan Rose /// Returns how the message was written in the source (property access, 94709647f28d7955d0c948ebbbb376a46844056f11aJordan Rose /// subscript, or explicit message send). 9488919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose ObjCMessageKind getMessageKind() const; 9498919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose 95009647f28d7955d0c948ebbbb376a46844056f11aJordan Rose /// Returns true if this property access or subscript is a setter (has the 95109647f28d7955d0c948ebbbb376a46844056f11aJordan Rose /// form of an assignment). 9528919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose bool isSetter() const { 9538919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose switch (getMessageKind()) { 9548919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose case OCM_Message: 9558919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose llvm_unreachable("This is not a pseudo-object access!"); 9568919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose case OCM_PropertyAccess: 9578919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose return getNumArgs() > 0; 9588919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose case OCM_Subscript: 9598919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose return getNumArgs() > 1; 9608919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose } 9618919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose llvm_unreachable("Unknown message kind"); 962740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 963740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 9644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Returns the property accessed by this method, either explicitly via 9654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // property syntax or implicitly via a getter or setter method. Returns 9664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // nullptr if the call is not a prooperty access. 9674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const ObjCPropertyDecl *getAccessedProperty() const; 9684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 969651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines RuntimeDefinition getRuntimeDefinition() const override; 970ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose 971651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool argumentsMayEscape() const override; 972651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 973651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, 974651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines BindingsTy &Bindings) const override; 975ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose 976651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ArrayRef<ParmVarDecl*> parameters() const override; 977b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 978651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Kind getKind() const override { return CE_ObjCMessage; } 979b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 980740d490593e0de8732a697c9f77b90ddd463863bJordan Rose static bool classof(const CallEvent *CA) { 981740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return CA->getKind() == CE_ObjCMessage; 982740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 983740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}; 984740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 985972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 986972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// \brief Manages the lifetime of CallEvent objects. 987972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// 988972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// CallEventManager provides a way to create arbitrary CallEvents "on the 989972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// stack" as if they were value objects by keeping a cache of CallEvent-sized 990972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// memory blocks. The CallEvents created by CallEventManager are only valid 991972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// for the lifetime of the OwnedCallEvent that holds them; right now these 992972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// objects cannot be copied and ownership cannot be transferred. 993972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseclass CallEventManager { 994972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose friend class CallEvent; 995972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 996972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose llvm::BumpPtrAllocator &Alloc; 997d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose SmallVector<void *, 8> Cache; 998651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef SimpleFunctionCall CallEventTemplateTy; 999972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 1000972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose void reclaim(const void *Memory) { 1001972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose Cache.push_back(const_cast<void *>(Memory)); 1002972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose } 1003972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 1004972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose /// Returns memory that can be initialized as a CallEvent. 1005972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose void *allocate() { 1006972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose if (Cache.empty()) 1007651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Alloc.Allocate<CallEventTemplateTy>(); 1008972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose else 1009972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose return Cache.pop_back_val(); 1010972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose } 1011972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 1012d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose template <typename T, typename Arg> 1013d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose T *create(Arg A, ProgramStateRef St, const LocationContext *LCtx) { 1014651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static_assert(sizeof(T) == sizeof(CallEventTemplateTy), 1015651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "CallEvent subclasses are not all the same size"); 1016d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose return new (allocate()) T(A, St, LCtx); 1017d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose } 1018d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 1019d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose template <typename T, typename Arg1, typename Arg2> 1020d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose T *create(Arg1 A1, Arg2 A2, ProgramStateRef St, const LocationContext *LCtx) { 1021651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static_assert(sizeof(T) == sizeof(CallEventTemplateTy), 1022651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "CallEvent subclasses are not all the same size"); 1023d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose return new (allocate()) T(A1, A2, St, LCtx); 1024d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose } 1025d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 1026d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose template <typename T, typename Arg1, typename Arg2, typename Arg3> 1027d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose T *create(Arg1 A1, Arg2 A2, Arg3 A3, ProgramStateRef St, 1028d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose const LocationContext *LCtx) { 1029651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static_assert(sizeof(T) == sizeof(CallEventTemplateTy), 1030651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "CallEvent subclasses are not all the same size"); 1031d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose return new (allocate()) T(A1, A2, A3, St, LCtx); 1032d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose } 1033d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 1034200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose template <typename T, typename Arg1, typename Arg2, typename Arg3, 1035200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose typename Arg4> 1036200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose T *create(Arg1 A1, Arg2 A2, Arg3 A3, Arg4 A4, ProgramStateRef St, 1037200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose const LocationContext *LCtx) { 1038651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static_assert(sizeof(T) == sizeof(CallEventTemplateTy), 1039651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "CallEvent subclasses are not all the same size"); 1040200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose return new (allocate()) T(A1, A2, A3, A4, St, LCtx); 1041200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose } 1042200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose 1043972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rosepublic: 1044972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose CallEventManager(llvm::BumpPtrAllocator &alloc) : Alloc(alloc) {} 1045d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 104657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose 104757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose CallEventRef<> 104857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose getCaller(const StackFrameContext *CalleeCtx, ProgramStateRef State); 104957c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose 105057c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose 1051645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose CallEventRef<> 1052d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose getSimpleCall(const CallExpr *E, ProgramStateRef State, 1053d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose const LocationContext *LCtx); 1054d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 1055d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose CallEventRef<ObjCMethodCall> 1056d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose getObjCMethodCall(const ObjCMessageExpr *E, ProgramStateRef State, 1057d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose const LocationContext *LCtx) { 1058d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose return create<ObjCMethodCall>(E, State, LCtx); 1059d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose } 1060d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 1061d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose CallEventRef<CXXConstructorCall> 1062d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose getCXXConstructorCall(const CXXConstructExpr *E, const MemRegion *Target, 1063d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose ProgramStateRef State, const LocationContext *LCtx) { 1064d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose return create<CXXConstructorCall>(E, Target, State, LCtx); 1065d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose } 1066d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 1067d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose CallEventRef<CXXDestructorCall> 1068d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose getCXXDestructorCall(const CXXDestructorDecl *DD, const Stmt *Trigger, 1069200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose const MemRegion *Target, bool IsBase, 1070200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose ProgramStateRef State, const LocationContext *LCtx) { 1071200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose return create<CXXDestructorCall>(DD, Trigger, Target, IsBase, State, LCtx); 1072d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose } 1073d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 1074d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose CallEventRef<CXXAllocatorCall> 1075d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose getCXXAllocatorCall(const CXXNewExpr *E, ProgramStateRef State, 1076d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose const LocationContext *LCtx) { 1077d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose return create<CXXAllocatorCall>(E, State, LCtx); 1078d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose } 1079972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose}; 1080972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 1081972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 1082972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rosetemplate <typename T> 1083d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan RoseCallEventRef<T> CallEvent::cloneWithState(ProgramStateRef NewState) const { 1084972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose assert(isa<T>(*this) && "Cloning to unrelated type"); 1085651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static_assert(sizeof(T) == sizeof(CallEvent), 1086651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "Subclasses may not add fields"); 1087972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 1088d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose if (NewState == State) 1089d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose return cast<T>(this); 1090d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 1091972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose CallEventManager &Mgr = State->getStateManager().getCallEventManager(); 1092972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose T *Copy = static_cast<T *>(Mgr.allocate()); 1093972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose cloneTo(Copy); 1094972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose assert(Copy->getKind() == this->getKind() && "Bad copy"); 1095972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 1096972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose Copy->State = NewState; 1097972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose return Copy; 1098972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose} 1099972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 1100972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseinline void CallEvent::Release() const { 1101972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose assert(RefCount > 0 && "Reference count is already zero."); 1102972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose --RefCount; 1103972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 1104972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose if (RefCount > 0) 1105972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose return; 1106972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 1107972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose CallEventManager &Mgr = State->getStateManager().getCallEventManager(); 1108972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose Mgr.reclaim(this); 1109972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 1110972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose this->~CallEvent(); 1111972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose} 1112972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 1113740d490593e0de8732a697c9f77b90ddd463863bJordan Rose} // end namespace ento 1114740d490593e0de8732a697c9f77b90ddd463863bJordan Rose} // end namespace clang 1115740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 111657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rosenamespace llvm { 111757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose // Support isa<>, cast<>, and dyn_cast<> for CallEventRef. 111857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose template<class T> struct simplify_type< clang::ento::CallEventRef<T> > { 111957c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose typedef const T *SimpleType; 112057c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose 112157c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose static SimpleType 112294cf910ac2d1719c1dfc163bbec3953f12efdf6fRafael Espindola getSimplifiedValue(clang::ento::CallEventRef<T> Val) { 1123c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return Val.get(); 112457c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose } 112557c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose }; 112657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose} 112757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose 1128740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#endif 1129