CallEvent.h revision 658a28479dd775f6ff2c07fa5699a7ea01e04127
1f540c54701e3eeb34cb619a3a4eb18f1ac70ef2dJordan Rose//===- CallEvent.h - Wrapper for all function and method calls ----*- C++ -*--//
2740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//
3740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//                     The LLVM Compiler Infrastructure
4740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//
5740d490593e0de8732a697c9f77b90ddd463863bJordan Rose// This file is distributed under the University of Illinois Open Source
6740d490593e0de8732a697c9f77b90ddd463863bJordan Rose// License. See LICENSE.TXT for details.
7740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//
8740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//===----------------------------------------------------------------------===//
9740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//
10740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \file This file defines CallEvent and its subclasses, which represent path-
11740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// sensitive instances of different kinds of function and method calls
12740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// (C, C++, and Objective-C).
13740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//
14740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//===----------------------------------------------------------------------===//
15740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
16740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#ifndef LLVM_CLANG_STATICANALYZER_PATHSENSITIVE_CALL
17740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#define LLVM_CLANG_STATICANALYZER_PATHSENSITIVE_CALL
18740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
19740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/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"
27740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
28740d490593e0de8732a697c9f77b90ddd463863bJordan Rosenamespace clang {
2928038f33aa2db4833881fea757a1f0daf85ac02bJordan Roseclass ProgramPoint;
3028038f33aa2db4833881fea757a1f0daf85ac02bJordan Roseclass ProgramPointTag;
3128038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose
32740d490593e0de8732a697c9f77b90ddd463863bJordan Rosenamespace ento {
33740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
34740d490593e0de8732a697c9f77b90ddd463863bJordan Roseenum CallEventKind {
35740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_Function,
36740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_Block,
37740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_BEG_SIMPLE_CALLS = CE_Function,
38740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_END_SIMPLE_CALLS = CE_Block,
39645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CE_CXXMember,
40645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CE_CXXMemberOperator,
418d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose  CE_CXXDestructor,
42645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CE_BEG_CXX_INSTANCE_CALLS = CE_CXXMember,
43645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CE_END_CXX_INSTANCE_CALLS = CE_CXXDestructor,
44645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CE_CXXConstructor,
4570cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  CE_CXXAllocator,
46740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_BEG_FUNCTION_CALLS = CE_Function,
4770cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  CE_END_FUNCTION_CALLS = CE_CXXAllocator,
488919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  CE_ObjCMessage
49740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
50740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
51972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseclass CallEvent;
52d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseclass CallEventManager;
53972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
54d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosetemplate<typename T = CallEvent>
55d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseclass CallEventRef : public IntrusiveRefCntPtr<const T> {
56d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosepublic:
57d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef(const T *Call) : IntrusiveRefCntPtr<const T>(Call) {}
58d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef(const CallEventRef &Orig) : IntrusiveRefCntPtr<const T>(Orig) {}
59d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
60d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<T> cloneWithState(ProgramStateRef State) const {
61d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return this->getPtr()->template cloneWithState<T>(State);
62d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
6357c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
6457c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  // Allow implicit conversions to a superclass type, since CallEventRef
6557c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  // behaves like a pointer-to-const.
6657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  template <typename SuperT>
6757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  operator CallEventRef<SuperT> () const {
6857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    return this->getPtr();
6957c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  }
70d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose};
71b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
721becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks/// \class RuntimeDefinition
735960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks/// \brief Defines the runtime definition of the called function.
741becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks///
751becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks/// Encapsulates the information we have about which Decl will be used
761becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks/// when the call is executed on the given path. When dealing with dynamic
771becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks/// dispatch, the information is based on DynamicTypeInfo and might not be
781becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks/// precise.
79fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaksclass RuntimeDefinition {
801becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks  /// The Declaration of the function which could be called at runtime.
811becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks  /// NULL if not available.
82fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaks  const Decl *D;
835960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks
845960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks  /// The region representing an object (ObjC/C++) on which the method is
855960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks  /// called. With dynamic dispatch, the method definition depends on the
861becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks  /// runtime type of this object. NULL when the DynamicTypeInfo is
871becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks  /// precise.
88fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaks  const MemRegion *R;
895960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks
90fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zakspublic:
91fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaks  RuntimeDefinition(): D(0), R(0) {}
92fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaks  RuntimeDefinition(const Decl *InD): D(InD), R(0) {}
93fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaks  RuntimeDefinition(const Decl *InD, const MemRegion *InR): D(InD), R(InR) {}
945960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks  const Decl *getDecl() { return D; }
951becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks
961becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks  /// \brief Check if the definition we have is precise.
971becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks  /// If not, it is possible that the call dispatches to another definition at
981becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks  /// execution time.
995960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks  bool mayHaveOtherDefinitions() { return R != 0; }
1001becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks
1011becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks  /// When other definitions are possible, returns the region whose runtime type
1021becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks  /// determines the method definition.
1031becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks  const MemRegion *getDispatchRegion() { return R; }
104e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks};
105e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks
106740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents an abstract call to a function or method along a
107740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// particular path.
108972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose///
109972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// CallEvents are created through the factory methods of CallEventManager.
110972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose///
111972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// CallEvents should always be cheap to create and destroy. In order for
112972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// CallEventManager to be able to re-use CallEvent-sized memory blocks,
113972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// subclasses of CallEvent may not add any data members to the base class.
114972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// Use the "Data" and "Location" fields instead.
115740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass CallEvent {
116740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
117740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  typedef CallEventKind Kind;
118740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
119b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseprivate:
1207c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  ProgramStateRef State;
1217c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  const LocationContext *LCtx;
122b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  llvm::PointerUnion<const Expr *, const Decl *> Origin;
123b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
124f56faa01936b9cf909623d7f06e3c2569ca4a78eDmitri Gribenko  void operator=(const CallEvent &) LLVM_DELETED_FUNCTION;
1257c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
126740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
127b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  // This is user data for subclasses.
128b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  const void *Data;
129972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
130972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  // This is user data for subclasses.
131972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  // This should come right before RefCount, so that the two fields can be
132972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  // packed together on LP64 platforms.
133b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SourceLocation Location;
134b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
135972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseprivate:
136972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  mutable unsigned RefCount;
137972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
138972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  template <typename T> friend struct llvm::IntrusiveRefCntPtrInfo;
139972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  void Retain() const { ++RefCount; }
140972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  void Release() const;
141972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
142972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseprotected:
143d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
144d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
1455204d9e2fe0ea4e4b9c85087e355021c93221764Jordan Rose  CallEvent(const Expr *E, ProgramStateRef state, const LocationContext *lctx)
146972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    : State(state), LCtx(lctx), Origin(E), RefCount(0) {}
147b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
1485204d9e2fe0ea4e4b9c85087e355021c93221764Jordan Rose  CallEvent(const Decl *D, ProgramStateRef state, const LocationContext *lctx)
149972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    : State(state), LCtx(lctx), Origin(D), RefCount(0) {}
150972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
151972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  // DO NOT MAKE PUBLIC
152972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  CallEvent(const CallEvent &Original)
153972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    : State(Original.State), LCtx(Original.LCtx), Origin(Original.Origin),
154972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose      Data(Original.Data), Location(Original.Location), RefCount(0) {}
155b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
156972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  /// Copies this CallEvent, with vtable intact, into a new block of memory.
157972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  virtual void cloneTo(void *Dest) const = 0;
158972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
159740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Get the value of arbitrary expressions at this point in the path.
160740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  SVal getSVal(const Stmt *S) const {
161b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getState()->getSVal(S, getLocationContext());
162740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
163740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
164972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
165658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks  typedef SmallVectorImpl<SVal> ValueList;
166740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
167740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Used to specify non-argument regions that will be invalidated as a
168740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// result of this call.
169658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks  virtual void getExtraInvalidatedValues(ValueList &Values) const {}
170740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
171740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
1727c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual ~CallEvent() {}
1737c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
174b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  /// \brief Returns the kind of call this is.
1757c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual Kind getKind() const = 0;
176b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
177740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the declaration of the function or method that will be
178740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// called. May be null.
1797c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const Decl *getDecl() const {
1807c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    return Origin.dyn_cast<const Decl *>();
1817c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  }
182740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
1835a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  /// \brief The state in which the call is being evaluated.
1840a6e09f67c719c318856be19d57e19972101f62cJordan Rose  const ProgramStateRef &getState() const {
1855a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks    return State;
1865a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  }
1875a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks
1885a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  /// \brief The context in which the call is being evaluated.
1895a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  const LocationContext *getLocationContext() const {
1905a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks    return LCtx;
1915a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  }
1925a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks
193ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose  /// \brief Returns the definition of the function or method that will be
1945960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks  /// called.
195ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek  virtual RuntimeDefinition getRuntimeDefinition() const = 0;
196ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose
197740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the expression whose value will be the result of this call.
198740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// May be null.
199b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  const Expr *getOriginExpr() const {
200b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return Origin.dyn_cast<const Expr *>();
201b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
202740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
203740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the number of arguments (explicit and implicit).
204740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  ///
205740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// Note that this may be greater than the number of parameters in the
206740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// callee's declaration, and that it may include arguments not written in
207740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// the source.
2087c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual unsigned getNumArgs() const = 0;
209740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
210740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns true if the callee is known to be from a system header.
211740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  bool isInSystemHeader() const {
212740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    const Decl *D = getDecl();
213740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    if (!D)
214740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      return false;
215740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
216740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    SourceLocation Loc = D->getLocation();
217740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    if (Loc.isValid()) {
218740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      const SourceManager &SM =
219b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose        getState()->getStateManager().getContext().getSourceManager();
220740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      return SM.isInSystemHeader(D->getLocation());
221740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    }
222740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
223740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    // Special case for implicitly-declared global operator new/delete.
224740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    // These should be considered system functions.
225740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
226740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      return FD->isOverloadedOperator() && FD->isImplicit() && FD->isGlobal();
227740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
228740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return false;
229740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
230740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
23142f2309f739549bead6e5a6c34fd1be4d087998fAnna Zaks  /// \brief Returns true if this is a call to a variadic function or method.
23242f2309f739549bead6e5a6c34fd1be4d087998fAnna Zaks  virtual bool isVariadic() const {
23342f2309f739549bead6e5a6c34fd1be4d087998fAnna Zaks    return false;
23442f2309f739549bead6e5a6c34fd1be4d087998fAnna Zaks  }
23542f2309f739549bead6e5a6c34fd1be4d087998fAnna Zaks
236de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose  /// \brief Returns a source range for the entire call, suitable for
237de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose  /// outputting in diagnostics.
2387c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual SourceRange getSourceRange() const {
2397c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    return getOriginExpr()->getSourceRange();
2407c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  }
241de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose
242740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the value of a given argument at the time of the call.
2437c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual SVal getArgSVal(unsigned Index) const;
244740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
245740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the expression associated with a given argument.
246740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// May be null if this expression does not appear in the source.
2477c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const Expr *getArgExpr(unsigned Index) const { return 0; }
248740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
249740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the source range for errors associated with this argument.
2507c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  ///
251740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// May be invalid if the argument is not written in the source.
2527c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual SourceRange getArgSourceRange(unsigned Index) const;
253740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
254740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the result type, adjusted for references.
255740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  QualType getResultType() const;
256740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
2572f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// \brief Returns the return value of the call.
2582f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  ///
2592f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// This should only be called if the CallEvent was created using a state in
2602f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// which the return value has already been bound to the origin expression.
2612f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  SVal getReturnValue() const;
2622f3017f9cbd3774f690c979410bfec38423d03afJordan Rose
263740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns true if any of the arguments appear to represent callbacks.
264740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  bool hasNonZeroCallbackArg() const;
265740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
26685d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  /// \brief Returns true if any of the arguments are known to escape to long-
26785d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  /// term storage, even if this method will not modify them.
26885d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  // NOTE: The exact semantics of this are still being defined!
26985d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  // We don't really want a list of hardcoded exceptions in the long run,
27085d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  // but we don't want duplicated lists of known APIs in the short term either.
2717c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual bool argumentsMayEscape() const {
2727c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    return hasNonZeroCallbackArg();
2737c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  }
27485d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
2752f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// \brief Returns true if the callee is an externally-visible function in the
2762f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// top-level namespace, such as \c malloc.
2772f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  ///
2782f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// You can use this call to determine that a particular function really is
2792f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// a library function and not, say, a C++ member function with the same name.
2802f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  ///
2812f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// If a name is provided, the function must additionally match the given
2822f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// name.
2832f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  ///
2842f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// Note that this deliberately excludes C++ library functions in the \c std
2852f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// namespace, but will include C library functions accessed through the
2862f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// \c std namespace. This also does not check if the function is declared
2872f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// as 'extern "C"', or if it uses C++ name mangling.
2882f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  // FIXME: Add a helper for checking namespaces.
2892f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  // FIXME: Move this down to AnyFunctionCall once checkers have more
2902f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  // precise callbacks.
2912f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  bool isGlobalCFunction(StringRef SpecificName = StringRef()) const;
2922f3017f9cbd3774f690c979410bfec38423d03afJordan Rose
2932f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// \brief Returns the name of the callee, if its name is a simple identifier.
2942f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  ///
2952f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// Note that this will fail for Objective-C methods, blocks, and C++
2962f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// overloaded operators. The former is named by a Selector rather than a
2972f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// simple identifier, and the latter two do not have names.
2982f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  // FIXME: Move this down to AnyFunctionCall once checkers have more
2992f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  // precise callbacks.
3002f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  const IdentifierInfo *getCalleeIdentifier() const {
3012f3017f9cbd3774f690c979410bfec38423d03afJordan Rose    const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(getDecl());
3022f3017f9cbd3774f690c979410bfec38423d03afJordan Rose    if (!ND)
3032f3017f9cbd3774f690c979410bfec38423d03afJordan Rose      return 0;
3042f3017f9cbd3774f690c979410bfec38423d03afJordan Rose    return ND->getIdentifier();
3052f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  }
3062f3017f9cbd3774f690c979410bfec38423d03afJordan Rose
30728038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose  /// \brief Returns an appropriate ProgramPoint for this call.
3088d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose  ProgramPoint getProgramPoint(bool IsPreVisit = false,
30928038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose                               const ProgramPointTag *Tag = 0) const;
31028038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose
311740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns a new state with all argument regions invalidated.
312740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  ///
313740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// This accepts an alternate state in case some processing has already
314740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// occurred.
315740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  ProgramStateRef invalidateRegions(unsigned BlockCount,
316740d490593e0de8732a697c9f77b90ddd463863bJordan Rose                                    ProgramStateRef Orig = 0) const;
317740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
318ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  typedef std::pair<Loc, SVal> FrameBindingTy;
319ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  typedef SmallVectorImpl<FrameBindingTy> BindingsTy;
320ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
321ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  /// Populates the given SmallVector with the bindings in the callee's stack
322ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  /// frame at the start of this call.
323ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
324ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                            BindingsTy &Bindings) const = 0;
325ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
326972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  /// Returns a copy of this CallEvent, but using the given state.
327972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  template <typename T>
328d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<T> cloneWithState(ProgramStateRef NewState) const;
329972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
330972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  /// Returns a copy of this CallEvent, but using the given state.
331d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<> cloneWithState(ProgramStateRef NewState) const {
332972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    return cloneWithState<CallEvent>(NewState);
333972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  }
334972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
3356062334cc388bce69fb3978c4ecb26c6485a5c2bJordan Rose  /// \brief Returns true if this is a statement is a function or method call
3366062334cc388bce69fb3978c4ecb26c6485a5c2bJordan Rose  /// of some kind.
3376062334cc388bce69fb3978c4ecb26c6485a5c2bJordan Rose  static bool isCallStmt(const Stmt *S);
33885d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
339962fbc46664f2486d6805549130fa6b310de6d60Jordan Rose  /// \brief Returns the result type of a function or method declaration.
340962fbc46664f2486d6805549130fa6b310de6d60Jordan Rose  ///
341962fbc46664f2486d6805549130fa6b310de6d60Jordan Rose  /// This will return a null QualType if the result type cannot be determined.
34216e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaks  static QualType getDeclaredResultType(const Decl *D);
34316e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaks
344e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  // Iterator access to formal parameters and their types.
345740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprivate:
346740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  typedef std::const_mem_fun_t<QualType, ParmVarDecl> get_type_fun;
347740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
348740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
349e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  typedef const ParmVarDecl * const *param_iterator;
350e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
351e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// Returns an iterator over the call's formal parameters.
352e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  ///
353e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// If UseDefinitionParams is set, this will return the parameter decls
354e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// used in the callee's definition (suitable for inlining). Most of the
355e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// time it is better to use the decl found by name lookup, which likely
356e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// carries more annotations.
357e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  ///
358e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// Remember that the number of formal parameters may not match the number
359e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// of arguments for all calls. However, the first parameter will always
360e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// correspond with the argument value returned by \c getArgSVal(0).
361e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  ///
362e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// If the call has no accessible declaration (or definition, if
363e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// \p UseDefinitionParams is set), \c param_begin() will be equal to
364e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// \c param_end().
365ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual param_iterator param_begin() const =0;
366e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// \sa param_begin()
367ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual param_iterator param_end() const = 0;
368e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
369740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  typedef llvm::mapped_iterator<param_iterator, get_type_fun>
370740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    param_type_iterator;
371740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
372e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// Returns an iterator over the types of the call's formal parameters.
373e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  ///
374e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// This uses the callee decl found by default name lookup rather than the
375e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// definition because it represents a public interface, and probably has
376e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// more annotations.
377740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  param_type_iterator param_type_begin() const {
378740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return llvm::map_iterator(param_begin(),
379740d490593e0de8732a697c9f77b90ddd463863bJordan Rose                              get_type_fun(&ParmVarDecl::getType));
380740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
381e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// \sa param_type_begin()
382740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  param_type_iterator param_type_end() const {
383740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return llvm::map_iterator(param_end(), get_type_fun(&ParmVarDecl::getType));
384740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
385740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
3860ffbfd1a7f80f9a3c07317cb8f44c562f2ba1ba5Jordan Rose  // For debugging purposes only
387b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  void dump(raw_ostream &Out) const;
38842c72c258e08ca79c9267346b4badcddd8fcd001Benjamin Kramer  LLVM_ATTRIBUTE_USED void dump() const;
389740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
390740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
391b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
392740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a call to any sort of function that might have a
393740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// FunctionDecl.
394740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass AnyFunctionCall : public CallEvent {
395740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
396b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  AnyFunctionCall(const Expr *E, ProgramStateRef St,
3977c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose                  const LocationContext *LCtx)
3987c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    : CallEvent(E, St, LCtx) {}
399b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  AnyFunctionCall(const Decl *D, ProgramStateRef St,
4007c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose                  const LocationContext *LCtx)
4017c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    : CallEvent(D, St, LCtx) {}
402972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  AnyFunctionCall(const AnyFunctionCall &Other) : CallEvent(Other) {}
403740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
404740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
405b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  // This function is overridden by subclasses, but they must return
406b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  // a FunctionDecl.
4077c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const FunctionDecl *getDecl() const {
4087c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    return cast<FunctionDecl>(CallEvent::getDecl());
409b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
410740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
411ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek  virtual RuntimeDefinition getRuntimeDefinition() const {
412ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose    const FunctionDecl *FD = getDecl();
413a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek    // Note that the AnalysisDeclContext will have the FunctionDecl with
414a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek    // the definition (if one exists).
415a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek    if (FD) {
416ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek      AnalysisDeclContext *AD =
417ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek        getLocationContext()->getAnalysisDeclContext()->
418ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek        getManager()->getContext(FD);
419a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek      if (AD->getBody())
420a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek        return RuntimeDefinition(AD->getDecl());
421a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek    }
422a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek
423e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks    return RuntimeDefinition();
424ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose  }
425ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose
42642f2309f739549bead6e5a6c34fd1be4d087998fAnna Zaks  virtual bool isVariadic() const {
42742f2309f739549bead6e5a6c34fd1be4d087998fAnna Zaks    return getDecl()->isVariadic();
42842f2309f739549bead6e5a6c34fd1be4d087998fAnna Zaks  }
42942f2309f739549bead6e5a6c34fd1be4d087998fAnna Zaks
4307c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual bool argumentsMayEscape() const;
431b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
432ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
433ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                            BindingsTy &Bindings) const;
434ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
435ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual param_iterator param_begin() const;
436ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual param_iterator param_end() const;
437b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
438740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
439740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() >= CE_BEG_FUNCTION_CALLS &&
440740d490593e0de8732a697c9f77b90ddd463863bJordan Rose           CA->getKind() <= CE_END_FUNCTION_CALLS;
441740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
442740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
443740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
444645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// \brief Represents a call to a non-C++ function, written as a CallExpr.
445740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass SimpleCall : public AnyFunctionCall {
446740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
447b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SimpleCall(const CallExpr *CE, ProgramStateRef St,
4487c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose             const LocationContext *LCtx)
449972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    : AnyFunctionCall(CE, St, LCtx) {}
450972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  SimpleCall(const SimpleCall &Other) : AnyFunctionCall(Other) {}
451740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
452740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
4537c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const CallExpr *getOriginExpr() const {
454b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CallExpr>(AnyFunctionCall::getOriginExpr());
455b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
456740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
4577c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const FunctionDecl *getDecl() const;
458740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
4597c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual unsigned getNumArgs() const { return getOriginExpr()->getNumArgs(); }
4607c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
4617c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const Expr *getArgExpr(unsigned Index) const {
462b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getArg(Index);
463740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
464740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
465740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
466740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() >= CE_BEG_SIMPLE_CALLS &&
467740d490593e0de8732a697c9f77b90ddd463863bJordan Rose           CA->getKind() <= CE_END_SIMPLE_CALLS;
468740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
469740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
470740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
471740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a C function or static C++ member function call.
472740d490593e0de8732a697c9f77b90ddd463863bJordan Rose///
473740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// Example: \c fun()
474740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass FunctionCall : public SimpleCall {
475d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
476972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
477d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseprotected:
478740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  FunctionCall(const CallExpr *CE, ProgramStateRef St,
479740d490593e0de8732a697c9f77b90ddd463863bJordan Rose               const LocationContext *LCtx)
4807c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    : SimpleCall(CE, St, LCtx) {}
481740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
482d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  FunctionCall(const FunctionCall &Other) : SimpleCall(Other) {}
483d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  virtual void cloneTo(void *Dest) const { new (Dest) FunctionCall(*this); }
484d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
485d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosepublic:
4867c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual Kind getKind() const { return CE_Function; }
487b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
488740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
489740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() == CE_Function;
490740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
491740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
492740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
493645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// \brief Represents a call to a block.
494645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose///
495645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// Example: <tt>^{ /* ... */ }()</tt>
496645baeed6800f952e9ad1d5666e01080385531a2Jordan Roseclass BlockCall : public SimpleCall {
497645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  friend class CallEventManager;
498645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
499645baeed6800f952e9ad1d5666e01080385531a2Jordan Roseprotected:
500645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  BlockCall(const CallExpr *CE, ProgramStateRef St,
501645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose            const LocationContext *LCtx)
502645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    : SimpleCall(CE, St, LCtx) {}
503645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
504645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  BlockCall(const BlockCall &Other) : SimpleCall(Other) {}
505645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual void cloneTo(void *Dest) const { new (Dest) BlockCall(*this); }
506645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
507658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks  virtual void getExtraInvalidatedValues(ValueList &Values) const;
508645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
509645baeed6800f952e9ad1d5666e01080385531a2Jordan Rosepublic:
510645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \brief Returns the region associated with this instance of the block.
511645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  ///
512645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// This may be NULL if the block's origin is unknown.
513645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  const BlockDataRegion *getBlockRegion() const;
514645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
515645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \brief Gets the declaration of the block.
516645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  ///
517645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// This is not an override of getDecl() because AnyFunctionCall has already
518645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// assumed that it's a FunctionDecl.
519645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  const BlockDecl *getBlockDecl() const {
520645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    const BlockDataRegion *BR = getBlockRegion();
521645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    if (!BR)
522645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose      return 0;
523645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return BR->getDecl();
524645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  }
525645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
526ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek  virtual RuntimeDefinition getRuntimeDefinition() const {
527645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return RuntimeDefinition(getBlockDecl());
528645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  }
529645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
53042f2309f739549bead6e5a6c34fd1be4d087998fAnna Zaks  virtual bool isVariadic() const {
53142f2309f739549bead6e5a6c34fd1be4d087998fAnna Zaks    return getBlockDecl()->isVariadic();
53242f2309f739549bead6e5a6c34fd1be4d087998fAnna Zaks  }
53342f2309f739549bead6e5a6c34fd1be4d087998fAnna Zaks
534645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
535645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose                                            BindingsTy &Bindings) const;
536645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
537645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual param_iterator param_begin() const;
538645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual param_iterator param_end() const;
539645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
540645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual Kind getKind() const { return CE_Block; }
541645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
542645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  static bool classof(const CallEvent *CA) {
543645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return CA->getKind() == CE_Block;
544645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  }
545645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose};
546645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
547c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// \brief Represents a non-static C++ member function call, no matter how
548c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// it is written.
549645baeed6800f952e9ad1d5666e01080385531a2Jordan Roseclass CXXInstanceCall : public AnyFunctionCall {
550740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
551658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks  virtual void getExtraInvalidatedValues(ValueList &Values) const;
552740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
553c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose  CXXInstanceCall(const CallExpr *CE, ProgramStateRef St,
5547c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose                  const LocationContext *LCtx)
555645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    : AnyFunctionCall(CE, St, LCtx) {}
556645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CXXInstanceCall(const FunctionDecl *D, ProgramStateRef St,
557645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose                  const LocationContext *LCtx)
558645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    : AnyFunctionCall(D, St, LCtx) {}
559645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
560c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose
561645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CXXInstanceCall(const CXXInstanceCall &Other) : AnyFunctionCall(Other) {}
562972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
563c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rosepublic:
5649da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose  /// \brief Returns the expression representing the implicit 'this' object.
565645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual const Expr *getCXXThisExpr() const { return 0; }
5669da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose
567ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  /// \brief Returns the value of the implicit 'this' object.
5686ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  virtual SVal getCXXThisVal() const;
569ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
570645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual const FunctionDecl *getDecl() const;
571645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
572ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek  virtual RuntimeDefinition getRuntimeDefinition() const;
573c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose
574ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
575ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                            BindingsTy &Bindings) const;
576ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
577c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose  static bool classof(const CallEvent *CA) {
578c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    return CA->getKind() >= CE_BEG_CXX_INSTANCE_CALLS &&
579c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose           CA->getKind() <= CE_END_CXX_INSTANCE_CALLS;
580c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose  }
581c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose};
582c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose
583c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// \brief Represents a non-static C++ member function call.
584c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose///
585c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// Example: \c obj.fun()
586c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Roseclass CXXMemberCall : public CXXInstanceCall {
587d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
588972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
589d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseprotected:
590740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CXXMemberCall(const CXXMemberCallExpr *CE, ProgramStateRef St,
591c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose                const LocationContext *LCtx)
5927c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    : CXXInstanceCall(CE, St, LCtx) {}
593740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
594d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CXXMemberCall(const CXXMemberCall &Other) : CXXInstanceCall(Other) {}
595d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  virtual void cloneTo(void *Dest) const { new (Dest) CXXMemberCall(*this); }
596d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
597d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosepublic:
5987c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const CXXMemberCallExpr *getOriginExpr() const {
599645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return cast<CXXMemberCallExpr>(CXXInstanceCall::getOriginExpr());
600645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  }
601645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
602645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual unsigned getNumArgs() const {
603645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    if (const CallExpr *CE = getOriginExpr())
604645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose      return CE->getNumArgs();
605645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return 0;
606645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  }
607645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
608645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual const Expr *getArgExpr(unsigned Index) const {
609645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return getOriginExpr()->getArg(Index);
610740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
611740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
6129da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose  virtual const Expr *getCXXThisExpr() const;
61300b4f64ecb26b031c1f4888f39be6c706156356aJordan Rose
614ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek  virtual RuntimeDefinition getRuntimeDefinition() const;
6157c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
6167c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual Kind getKind() const { return CE_CXXMember; }
617e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
618740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
619740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() == CE_CXXMember;
620740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
621740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
622740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
623fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// \brief Represents a C++ overloaded operator call where the operator is
624fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// implemented as a non-static member function.
625fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose///
626fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// Example: <tt>iter + 1</tt>
627c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Roseclass CXXMemberOperatorCall : public CXXInstanceCall {
628d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
629d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
630972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseprotected:
631d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CXXMemberOperatorCall(const CXXOperatorCallExpr *CE, ProgramStateRef St,
632d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                        const LocationContext *LCtx)
633d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    : CXXInstanceCall(CE, St, LCtx) {}
634d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
635972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  CXXMemberOperatorCall(const CXXMemberOperatorCall &Other)
636972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    : CXXInstanceCall(Other) {}
637972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  virtual void cloneTo(void *Dest) const {
638972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    new (Dest) CXXMemberOperatorCall(*this);
639972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  }
640972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
641fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rosepublic:
6427c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const CXXOperatorCallExpr *getOriginExpr() const {
643645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return cast<CXXOperatorCallExpr>(CXXInstanceCall::getOriginExpr());
644fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  }
645fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose
6467c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual unsigned getNumArgs() const {
6477c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    return getOriginExpr()->getNumArgs() - 1;
6487c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  }
6497c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const Expr *getArgExpr(unsigned Index) const {
650fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose    return getOriginExpr()->getArg(Index + 1);
651fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  }
652fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose
6539da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose  virtual const Expr *getCXXThisExpr() const;
6547c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
6557c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual Kind getKind() const { return CE_CXXMemberOperator; }
656e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
657fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  static bool classof(const CallEvent *CA) {
658fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose    return CA->getKind() == CE_CXXMemberOperator;
659fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  }
660fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose};
661fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose
662645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// \brief Represents an implicit call to a C++ destructor.
663740d490593e0de8732a697c9f77b90ddd463863bJordan Rose///
664645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// This can occur at the end of a scope (for automatic objects), at the end
665645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// of a full-expression (for temporaries), or as part of a delete.
666645baeed6800f952e9ad1d5666e01080385531a2Jordan Roseclass CXXDestructorCall : public CXXInstanceCall {
667d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
668d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
669740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
670200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose  typedef llvm::PointerIntPair<const MemRegion *, 1, bool> DtorDataTy;
671200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose
672645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// Creates an implicit destructor.
67369f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  ///
674645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \param DD The destructor that will be called.
675645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \param Trigger The statement whose completion causes this destructor call.
676645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \param Target The object region to be destructed.
677645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \param St The path-sensitive state at this point in the program.
678645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \param LCtx The location context at this point in the program.
679645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CXXDestructorCall(const CXXDestructorDecl *DD, const Stmt *Trigger,
680200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose                    const MemRegion *Target, bool IsBaseDestructor,
681200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose                    ProgramStateRef St, const LocationContext *LCtx)
682645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    : CXXInstanceCall(DD, St, LCtx) {
683200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose    Data = DtorDataTy(Target, IsBaseDestructor).getOpaqueValue();
684645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    Location = Trigger->getLocEnd();
685740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
686740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
687645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CXXDestructorCall(const CXXDestructorCall &Other) : CXXInstanceCall(Other) {}
688645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual void cloneTo(void *Dest) const { new (Dest) CXXDestructorCall(*this); }
689ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose
690645baeed6800f952e9ad1d5666e01080385531a2Jordan Rosepublic:
691645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual SourceRange getSourceRange() const { return Location; }
692645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual unsigned getNumArgs() const { return 0; }
693ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
694ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek  virtual RuntimeDefinition getRuntimeDefinition() const;
695200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose
696645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \brief Returns the value of the implicit 'this' object.
697645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual SVal getCXXThisVal() const;
698b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
699200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose  /// Returns true if this is a call to a base class destructor.
700200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose  bool isBaseDestructor() const {
701200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose    return DtorDataTy::getFromOpaqueValue(Data).getInt();
702200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose  }
703200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose
704645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual Kind getKind() const { return CE_CXXDestructor; }
705b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
706740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
707645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return CA->getKind() == CE_CXXDestructor;
708740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
709740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
710740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
711740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a call to a C++ constructor.
712740d490593e0de8732a697c9f77b90ddd463863bJordan Rose///
713740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// Example: \c T(1)
714740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass CXXConstructorCall : public AnyFunctionCall {
715d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
716b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
717d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseprotected:
718d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  /// Creates a constructor call.
719d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  ///
720d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  /// \param CE The constructor expression as written in the source.
721d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  /// \param Target The region where the object should be constructed. If NULL,
722d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  ///               a new symbolic region will be used.
723d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  /// \param St The path-sensitive state at this point in the program.
724d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  /// \param LCtx The location context at this point in the program.
72570517ca5c07c4b41ff8662b94ee22047b0299f8cDmitri Gribenko  CXXConstructorCall(const CXXConstructExpr *CE, const MemRegion *Target,
726740d490593e0de8732a697c9f77b90ddd463863bJordan Rose                     ProgramStateRef St, const LocationContext *LCtx)
7277c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    : AnyFunctionCall(CE, St, LCtx) {
72870517ca5c07c4b41ff8662b94ee22047b0299f8cDmitri Gribenko    Data = Target;
729b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
730740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
731d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CXXConstructorCall(const CXXConstructorCall &Other) : AnyFunctionCall(Other){}
732d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  virtual void cloneTo(void *Dest) const { new (Dest) CXXConstructorCall(*this); }
733d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
734658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks  virtual void getExtraInvalidatedValues(ValueList &Values) const;
735d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
736d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosepublic:
7377c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const CXXConstructExpr *getOriginExpr() const {
738b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CXXConstructExpr>(AnyFunctionCall::getOriginExpr());
739b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
740b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
7417c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const CXXConstructorDecl *getDecl() const {
742b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getConstructor();
743740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
744740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
7457c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual unsigned getNumArgs() const { return getOriginExpr()->getNumArgs(); }
746740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
7477c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const Expr *getArgExpr(unsigned Index) const {
748b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getArg(Index);
749740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
750740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
751ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  /// \brief Returns the value of the implicit 'this' object.
752645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  SVal getCXXThisVal() const;
7537c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
754ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
755ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                            BindingsTy &Bindings) const;
756ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
7577c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual Kind getKind() const { return CE_CXXConstructor; }
758e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
759740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
760740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() == CE_CXXConstructor;
761740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
762740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
763740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
7640e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose/// \brief Represents the memory allocation call in a C++ new-expression.
7650e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose///
7660e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose/// This is a call to "operator new".
76770cbf3cc09eb21db1108396d30a414ea66d842ccJordan Roseclass CXXAllocatorCall : public AnyFunctionCall {
768d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
769972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
770d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseprotected:
771b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  CXXAllocatorCall(const CXXNewExpr *E, ProgramStateRef St,
77270cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose                   const LocationContext *LCtx)
7737c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    : AnyFunctionCall(E, St, LCtx) {}
77470cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
775d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CXXAllocatorCall(const CXXAllocatorCall &Other) : AnyFunctionCall(Other) {}
776d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  virtual void cloneTo(void *Dest) const { new (Dest) CXXAllocatorCall(*this); }
777d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
778d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosepublic:
7797c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const CXXNewExpr *getOriginExpr() const {
780b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CXXNewExpr>(AnyFunctionCall::getOriginExpr());
781b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
782b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
7837c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const FunctionDecl *getDecl() const {
784b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getOperatorNew();
78570cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  }
78670cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
7877c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual unsigned getNumArgs() const {
788b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getNumPlacementArgs() + 1;
789b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
79070cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
7917c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const Expr *getArgExpr(unsigned Index) const {
79270cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose    // The first argument of an allocator call is the size of the allocation.
79370cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose    if (Index == 0)
79470cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose      return 0;
795b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getPlacementArg(Index - 1);
79670cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  }
79770cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
7987c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual Kind getKind() const { return CE_CXXAllocator; }
799b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
80070cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  static bool classof(const CallEvent *CE) {
80170cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose    return CE->getKind() == CE_CXXAllocator;
80270cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  }
80370cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose};
80470cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
8058919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose/// \brief Represents the ways an Objective-C message send can occur.
8068919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose//
8078919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose// Note to maintainers: OCM_Message should always be last, since it does not
8088919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose// need to fit in the Data field's low bits.
8098919e688dc610d1f632a4d43f7f1489f67255476Jordan Roseenum ObjCMessageKind {
8108919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  OCM_PropertyAccess,
8118919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  OCM_Subscript,
8128919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  OCM_Message
8138919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose};
8148919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
815cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose/// \brief Represents any expression that calls an Objective-C method.
8168919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose///
8178919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose/// This includes all of the kinds listed in ObjCMessageKind.
818cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Roseclass ObjCMethodCall : public CallEvent {
819d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
820d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
8218919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  const PseudoObjectExpr *getContainingPseudoObjectExpr() const;
822cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose
8238919e688dc610d1f632a4d43f7f1489f67255476Jordan Roseprotected:
824d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  ObjCMethodCall(const ObjCMessageExpr *Msg, ProgramStateRef St,
825d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                 const LocationContext *LCtx)
826d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    : CallEvent(Msg, St, LCtx) {
827d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    Data = 0;
828d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
829d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
830972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  ObjCMethodCall(const ObjCMethodCall &Other) : CallEvent(Other) {}
831972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  virtual void cloneTo(void *Dest) const { new (Dest) ObjCMethodCall(*this); }
832972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
833658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks  virtual void getExtraInvalidatedValues(ValueList &Values) const;
834740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
8353f558af01643787d209a133215b0abec81b5fe30Anna Zaks  /// Check if the selector may have multiple definitions (may have overrides).
8363f558af01643787d209a133215b0abec81b5fe30Anna Zaks  virtual bool canBeOverridenInSubclass(ObjCInterfaceDecl *IDecl,
8373f558af01643787d209a133215b0abec81b5fe30Anna Zaks                                        Selector Sel) const;
8383f558af01643787d209a133215b0abec81b5fe30Anna Zaks
839740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
8407c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const ObjCMessageExpr *getOriginExpr() const {
8418919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return cast<ObjCMessageExpr>(CallEvent::getOriginExpr());
842cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose  }
8437c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const ObjCMethodDecl *getDecl() const {
844b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getMethodDecl();
845b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
8467c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual unsigned getNumArgs() const {
847b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getNumArgs();
848b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
8497c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const Expr *getArgExpr(unsigned Index) const {
850b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getArg(Index);
851b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
85242f2309f739549bead6e5a6c34fd1be4d087998fAnna Zaks  virtual bool isVariadic() const {
85342f2309f739549bead6e5a6c34fd1be4d087998fAnna Zaks    return getDecl()->isVariadic();
85442f2309f739549bead6e5a6c34fd1be4d087998fAnna Zaks  }
855740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
8568919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  bool isInstanceMessage() const {
8578919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return getOriginExpr()->isInstanceMessage();
8588919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  }
8598919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  ObjCMethodFamily getMethodFamily() const {
8608919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return getOriginExpr()->getMethodFamily();
8618919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  }
8628919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  Selector getSelector() const {
8638919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return getOriginExpr()->getSelector();
8648919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  }
8658919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
8667c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual SourceRange getSourceRange() const;
8678919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
8680e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  /// \brief Returns the value of the receiver at the time of this call.
869740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  SVal getReceiverSVal() const;
870740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
8715a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  /// \brief Return the value of 'self' if available.
8725a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  SVal getSelfSVal() const;
8735a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks
8740e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  /// \brief Get the interface for the receiver.
8750e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  ///
8760e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  /// This works whether this is an instance message or a class message.
8770e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  /// However, it currently just uses the static type of the receiver.
878cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose  const ObjCInterfaceDecl *getReceiverInterface() const {
879b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getReceiverInterface();
880cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose  }
881cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose
8825a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  /// \brief Checks if the receiver refers to 'self' or 'super'.
8835a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  bool isReceiverSelfOrSuper() const;
8845a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks
88509647f28d7955d0c948ebbbb376a46844056f11aJordan Rose  /// Returns how the message was written in the source (property access,
88609647f28d7955d0c948ebbbb376a46844056f11aJordan Rose  /// subscript, or explicit message send).
8878919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  ObjCMessageKind getMessageKind() const;
8888919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
88909647f28d7955d0c948ebbbb376a46844056f11aJordan Rose  /// Returns true if this property access or subscript is a setter (has the
89009647f28d7955d0c948ebbbb376a46844056f11aJordan Rose  /// form of an assignment).
8918919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  bool isSetter() const {
8928919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    switch (getMessageKind()) {
8938919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    case OCM_Message:
8948919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      llvm_unreachable("This is not a pseudo-object access!");
8958919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    case OCM_PropertyAccess:
8968919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      return getNumArgs() > 0;
8978919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    case OCM_Subscript:
8988919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      return getNumArgs() > 1;
8998919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    }
9008919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    llvm_unreachable("Unknown message kind");
901740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
902740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
903ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek  virtual RuntimeDefinition getRuntimeDefinition() const;
904ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose
905ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
906ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                            BindingsTy &Bindings) const;
907ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
908ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual param_iterator param_begin() const;
909ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual param_iterator param_end() const;
910b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
9117c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual Kind getKind() const { return CE_ObjCMessage; }
912b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
913740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
914740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() == CE_ObjCMessage;
915740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
916740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
917740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
918972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
919972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// \brief Manages the lifetime of CallEvent objects.
920972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose///
921972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// CallEventManager provides a way to create arbitrary CallEvents "on the
922972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// stack" as if they were value objects by keeping a cache of CallEvent-sized
923972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// memory blocks. The CallEvents created by CallEventManager are only valid
924972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// for the lifetime of the OwnedCallEvent that holds them; right now these
925972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// objects cannot be copied and ownership cannot be transferred.
926972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseclass CallEventManager {
927972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  friend class CallEvent;
928972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
929972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  llvm::BumpPtrAllocator &Alloc;
930d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  SmallVector<void *, 8> Cache;
931972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
932972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  void reclaim(const void *Memory) {
933972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    Cache.push_back(const_cast<void *>(Memory));
934972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  }
935972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
936972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  /// Returns memory that can be initialized as a CallEvent.
937972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  void *allocate() {
938972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    if (Cache.empty())
939972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose      return Alloc.Allocate<FunctionCall>();
940972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    else
941972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose      return Cache.pop_back_val();
942972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  }
943972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
944d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  template <typename T, typename Arg>
945d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  T *create(Arg A, ProgramStateRef St, const LocationContext *LCtx) {
946d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return new (allocate()) T(A, St, LCtx);
947d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
948d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
949d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  template <typename T, typename Arg1, typename Arg2>
950d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  T *create(Arg1 A1, Arg2 A2, ProgramStateRef St, const LocationContext *LCtx) {
951d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return new (allocate()) T(A1, A2, St, LCtx);
952d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
953d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
954d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  template <typename T, typename Arg1, typename Arg2, typename Arg3>
955d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  T *create(Arg1 A1, Arg2 A2, Arg3 A3, ProgramStateRef St,
956d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose            const LocationContext *LCtx) {
957d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return new (allocate()) T(A1, A2, A3, St, LCtx);
958d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
959d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
960200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose  template <typename T, typename Arg1, typename Arg2, typename Arg3,
961200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose            typename Arg4>
962200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose  T *create(Arg1 A1, Arg2 A2, Arg3 A3, Arg4 A4, ProgramStateRef St,
963200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose            const LocationContext *LCtx) {
964200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose    return new (allocate()) T(A1, A2, A3, A4, St, LCtx);
965200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose  }
966200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose
967972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rosepublic:
968972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  CallEventManager(llvm::BumpPtrAllocator &alloc) : Alloc(alloc) {}
969d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
97057c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
97157c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  CallEventRef<>
97257c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  getCaller(const StackFrameContext *CalleeCtx, ProgramStateRef State);
97357c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
97457c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
975645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CallEventRef<>
976d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  getSimpleCall(const CallExpr *E, ProgramStateRef State,
977d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                const LocationContext *LCtx);
978d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
979d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<ObjCMethodCall>
980d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  getObjCMethodCall(const ObjCMessageExpr *E, ProgramStateRef State,
981d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                    const LocationContext *LCtx) {
982d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return create<ObjCMethodCall>(E, State, LCtx);
983d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
984d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
985d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<CXXConstructorCall>
986d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  getCXXConstructorCall(const CXXConstructExpr *E, const MemRegion *Target,
987d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                        ProgramStateRef State, const LocationContext *LCtx) {
988d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return create<CXXConstructorCall>(E, Target, State, LCtx);
989d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
990d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
991d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<CXXDestructorCall>
992d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  getCXXDestructorCall(const CXXDestructorDecl *DD, const Stmt *Trigger,
993200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose                       const MemRegion *Target, bool IsBase,
994200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose                       ProgramStateRef State, const LocationContext *LCtx) {
995200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose    return create<CXXDestructorCall>(DD, Trigger, Target, IsBase, State, LCtx);
996d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
997d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
998d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<CXXAllocatorCall>
999d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  getCXXAllocatorCall(const CXXNewExpr *E, ProgramStateRef State,
1000d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                      const LocationContext *LCtx) {
1001d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return create<CXXAllocatorCall>(E, State, LCtx);
1002d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
1003972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose};
1004972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
1005972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
1006972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rosetemplate <typename T>
1007d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan RoseCallEventRef<T> CallEvent::cloneWithState(ProgramStateRef NewState) const {
1008972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  assert(isa<T>(*this) && "Cloning to unrelated type");
1009972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  assert(sizeof(T) == sizeof(CallEvent) && "Subclasses may not add fields");
1010972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
1011d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  if (NewState == State)
1012d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return cast<T>(this);
1013d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
1014972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  CallEventManager &Mgr = State->getStateManager().getCallEventManager();
1015972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  T *Copy = static_cast<T *>(Mgr.allocate());
1016972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  cloneTo(Copy);
1017972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  assert(Copy->getKind() == this->getKind() && "Bad copy");
1018972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
1019972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  Copy->State = NewState;
1020972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  return Copy;
1021972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose}
1022972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
1023972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseinline void CallEvent::Release() const {
1024972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  assert(RefCount > 0 && "Reference count is already zero.");
1025972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  --RefCount;
1026972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
1027972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  if (RefCount > 0)
1028972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    return;
1029972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
1030972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  CallEventManager &Mgr = State->getStateManager().getCallEventManager();
1031972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  Mgr.reclaim(this);
1032972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
1033972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  this->~CallEvent();
1034972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose}
1035972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
1036740d490593e0de8732a697c9f77b90ddd463863bJordan Rose} // end namespace ento
1037740d490593e0de8732a697c9f77b90ddd463863bJordan Rose} // end namespace clang
1038740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
103957c033621dacd8720ac9ff65a09025f14f70e22fJordan Rosenamespace llvm {
104057c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  // Support isa<>, cast<>, and dyn_cast<> for CallEventRef.
104157c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  template<class T> struct simplify_type< clang::ento::CallEventRef<T> > {
104257c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    typedef const T *SimpleType;
104357c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
104457c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    static SimpleType
104594cf910ac2d1719c1dfc163bbec3953f12efdf6fRafael Espindola    getSimplifiedValue(clang::ento::CallEventRef<T> Val) {
104657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose      return Val.getPtr();
104757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    }
104857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  };
104957c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose}
105057c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
1051740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#endif
1052