1 //===- CallEvent.h - Wrapper for all function and method calls ----*- C++ -*--// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 /// \file This file defines CallEvent and its subclasses, which represent path- 11 /// sensitive instances of different kinds of function and method calls 12 /// (C, C++, and Objective-C). 13 // 14 //===----------------------------------------------------------------------===// 15 16 #ifndef LLVM_CLANG_STATICANALYZER_PATHSENSITIVE_CALL 17 #define LLVM_CLANG_STATICANALYZER_PATHSENSITIVE_CALL 18 19 #include "clang/AST/DeclCXX.h" 20 #include "clang/AST/ExprCXX.h" 21 #include "clang/AST/ExprObjC.h" 22 #include "clang/Analysis/AnalysisContext.h" 23 #include "clang/Basic/SourceManager.h" 24 #include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h" 25 #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h" 26 #include "llvm/ADT/PointerIntPair.h" 27 28 namespace clang { 29 class ProgramPoint; 30 class ProgramPointTag; 31 32 namespace ento { 33 34 enum CallEventKind { 35 CE_Function, 36 CE_CXXMember, 37 CE_CXXMemberOperator, 38 CE_CXXDestructor, 39 CE_BEG_CXX_INSTANCE_CALLS = CE_CXXMember, 40 CE_END_CXX_INSTANCE_CALLS = CE_CXXDestructor, 41 CE_CXXConstructor, 42 CE_CXXAllocator, 43 CE_BEG_FUNCTION_CALLS = CE_Function, 44 CE_END_FUNCTION_CALLS = CE_CXXAllocator, 45 CE_Block, 46 CE_ObjCMessage 47 }; 48 49 class CallEvent; 50 class CallEventManager; 51 52 template<typename T = CallEvent> 53 class CallEventRef : public IntrusiveRefCntPtr<const T> { 54 public: 55 CallEventRef(const T *Call) : IntrusiveRefCntPtr<const T>(Call) {} 56 CallEventRef(const CallEventRef &Orig) : IntrusiveRefCntPtr<const T>(Orig) {} 57 58 CallEventRef<T> cloneWithState(ProgramStateRef State) const { 59 return this->get()->template cloneWithState<T>(State); 60 } 61 62 // Allow implicit conversions to a superclass type, since CallEventRef 63 // behaves like a pointer-to-const. 64 template <typename SuperT> 65 operator CallEventRef<SuperT> () const { 66 return this->get(); 67 } 68 }; 69 70 /// \class RuntimeDefinition 71 /// \brief Defines the runtime definition of the called function. 72 /// 73 /// Encapsulates the information we have about which Decl will be used 74 /// when the call is executed on the given path. When dealing with dynamic 75 /// dispatch, the information is based on DynamicTypeInfo and might not be 76 /// precise. 77 class RuntimeDefinition { 78 /// The Declaration of the function which could be called at runtime. 79 /// NULL if not available. 80 const Decl *D; 81 82 /// The region representing an object (ObjC/C++) on which the method is 83 /// called. With dynamic dispatch, the method definition depends on the 84 /// runtime type of this object. NULL when the DynamicTypeInfo is 85 /// precise. 86 const MemRegion *R; 87 88 public: 89 RuntimeDefinition(): D(nullptr), R(nullptr) {} 90 RuntimeDefinition(const Decl *InD): D(InD), R(nullptr) {} 91 RuntimeDefinition(const Decl *InD, const MemRegion *InR): D(InD), R(InR) {} 92 const Decl *getDecl() { return D; } 93 94 /// \brief Check if the definition we have is precise. 95 /// If not, it is possible that the call dispatches to another definition at 96 /// execution time. 97 bool mayHaveOtherDefinitions() { return R != nullptr; } 98 99 /// When other definitions are possible, returns the region whose runtime type 100 /// determines the method definition. 101 const MemRegion *getDispatchRegion() { return R; } 102 }; 103 104 /// \brief Represents an abstract call to a function or method along a 105 /// particular path. 106 /// 107 /// CallEvents are created through the factory methods of CallEventManager. 108 /// 109 /// CallEvents should always be cheap to create and destroy. In order for 110 /// CallEventManager to be able to re-use CallEvent-sized memory blocks, 111 /// subclasses of CallEvent may not add any data members to the base class. 112 /// Use the "Data" and "Location" fields instead. 113 class CallEvent { 114 public: 115 typedef CallEventKind Kind; 116 117 private: 118 ProgramStateRef State; 119 const LocationContext *LCtx; 120 llvm::PointerUnion<const Expr *, const Decl *> Origin; 121 122 void operator=(const CallEvent &) LLVM_DELETED_FUNCTION; 123 124 protected: 125 // This is user data for subclasses. 126 const void *Data; 127 128 // This is user data for subclasses. 129 // This should come right before RefCount, so that the two fields can be 130 // packed together on LP64 platforms. 131 SourceLocation Location; 132 133 private: 134 mutable unsigned RefCount; 135 136 template <typename T> friend struct llvm::IntrusiveRefCntPtrInfo; 137 void Retain() const { ++RefCount; } 138 void Release() const; 139 140 protected: 141 friend class CallEventManager; 142 143 CallEvent(const Expr *E, ProgramStateRef state, const LocationContext *lctx) 144 : State(state), LCtx(lctx), Origin(E), RefCount(0) {} 145 146 CallEvent(const Decl *D, ProgramStateRef state, const LocationContext *lctx) 147 : State(state), LCtx(lctx), Origin(D), RefCount(0) {} 148 149 // DO NOT MAKE PUBLIC 150 CallEvent(const CallEvent &Original) 151 : State(Original.State), LCtx(Original.LCtx), Origin(Original.Origin), 152 Data(Original.Data), Location(Original.Location), RefCount(0) {} 153 154 /// Copies this CallEvent, with vtable intact, into a new block of memory. 155 virtual void cloneTo(void *Dest) const = 0; 156 157 /// \brief Get the value of arbitrary expressions at this point in the path. 158 SVal getSVal(const Stmt *S) const { 159 return getState()->getSVal(S, getLocationContext()); 160 } 161 162 163 typedef SmallVectorImpl<SVal> ValueList; 164 165 /// \brief Used to specify non-argument regions that will be invalidated as a 166 /// result of this call. 167 virtual void getExtraInvalidatedValues(ValueList &Values) const {} 168 169 public: 170 virtual ~CallEvent() {} 171 172 /// \brief Returns the kind of call this is. 173 virtual Kind getKind() const = 0; 174 175 /// \brief Returns the declaration of the function or method that will be 176 /// called. May be null. 177 virtual const Decl *getDecl() const { 178 return Origin.dyn_cast<const Decl *>(); 179 } 180 181 /// \brief The state in which the call is being evaluated. 182 const ProgramStateRef &getState() const { 183 return State; 184 } 185 186 /// \brief The context in which the call is being evaluated. 187 const LocationContext *getLocationContext() const { 188 return LCtx; 189 } 190 191 /// \brief Returns the definition of the function or method that will be 192 /// called. 193 virtual RuntimeDefinition getRuntimeDefinition() const = 0; 194 195 /// \brief Returns the expression whose value will be the result of this call. 196 /// May be null. 197 const Expr *getOriginExpr() const { 198 return Origin.dyn_cast<const Expr *>(); 199 } 200 201 /// \brief Returns the number of arguments (explicit and implicit). 202 /// 203 /// Note that this may be greater than the number of parameters in the 204 /// callee's declaration, and that it may include arguments not written in 205 /// the source. 206 virtual unsigned getNumArgs() const = 0; 207 208 /// \brief Returns true if the callee is known to be from a system header. 209 bool isInSystemHeader() const { 210 const Decl *D = getDecl(); 211 if (!D) 212 return false; 213 214 SourceLocation Loc = D->getLocation(); 215 if (Loc.isValid()) { 216 const SourceManager &SM = 217 getState()->getStateManager().getContext().getSourceManager(); 218 return SM.isInSystemHeader(D->getLocation()); 219 } 220 221 // Special case for implicitly-declared global operator new/delete. 222 // These should be considered system functions. 223 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) 224 return FD->isOverloadedOperator() && FD->isImplicit() && FD->isGlobal(); 225 226 return false; 227 } 228 229 /// \brief Returns a source range for the entire call, suitable for 230 /// outputting in diagnostics. 231 virtual SourceRange getSourceRange() const { 232 return getOriginExpr()->getSourceRange(); 233 } 234 235 /// \brief Returns the value of a given argument at the time of the call. 236 virtual SVal getArgSVal(unsigned Index) const; 237 238 /// \brief Returns the expression associated with a given argument. 239 /// May be null if this expression does not appear in the source. 240 virtual const Expr *getArgExpr(unsigned Index) const { return nullptr; } 241 242 /// \brief Returns the source range for errors associated with this argument. 243 /// 244 /// May be invalid if the argument is not written in the source. 245 virtual SourceRange getArgSourceRange(unsigned Index) const; 246 247 /// \brief Returns the result type, adjusted for references. 248 QualType getResultType() const; 249 250 /// \brief Returns the return value of the call. 251 /// 252 /// This should only be called if the CallEvent was created using a state in 253 /// which the return value has already been bound to the origin expression. 254 SVal getReturnValue() const; 255 256 /// \brief Returns true if any of the arguments appear to represent callbacks. 257 bool hasNonZeroCallbackArg() const; 258 259 /// \brief Returns true if any of the arguments are known to escape to long- 260 /// term storage, even if this method will not modify them. 261 // NOTE: The exact semantics of this are still being defined! 262 // We don't really want a list of hardcoded exceptions in the long run, 263 // but we don't want duplicated lists of known APIs in the short term either. 264 virtual bool argumentsMayEscape() const { 265 return hasNonZeroCallbackArg(); 266 } 267 268 /// \brief Returns true if the callee is an externally-visible function in the 269 /// top-level namespace, such as \c malloc. 270 /// 271 /// You can use this call to determine that a particular function really is 272 /// a library function and not, say, a C++ member function with the same name. 273 /// 274 /// If a name is provided, the function must additionally match the given 275 /// name. 276 /// 277 /// Note that this deliberately excludes C++ library functions in the \c std 278 /// namespace, but will include C library functions accessed through the 279 /// \c std namespace. This also does not check if the function is declared 280 /// as 'extern "C"', or if it uses C++ name mangling. 281 // FIXME: Add a helper for checking namespaces. 282 // FIXME: Move this down to AnyFunctionCall once checkers have more 283 // precise callbacks. 284 bool isGlobalCFunction(StringRef SpecificName = StringRef()) const; 285 286 /// \brief Returns the name of the callee, if its name is a simple identifier. 287 /// 288 /// Note that this will fail for Objective-C methods, blocks, and C++ 289 /// overloaded operators. The former is named by a Selector rather than a 290 /// simple identifier, and the latter two do not have names. 291 // FIXME: Move this down to AnyFunctionCall once checkers have more 292 // precise callbacks. 293 const IdentifierInfo *getCalleeIdentifier() const { 294 const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(getDecl()); 295 if (!ND) 296 return nullptr; 297 return ND->getIdentifier(); 298 } 299 300 /// \brief Returns an appropriate ProgramPoint for this call. 301 ProgramPoint getProgramPoint(bool IsPreVisit = false, 302 const ProgramPointTag *Tag = nullptr) const; 303 304 /// \brief Returns a new state with all argument regions invalidated. 305 /// 306 /// This accepts an alternate state in case some processing has already 307 /// occurred. 308 ProgramStateRef invalidateRegions(unsigned BlockCount, 309 ProgramStateRef Orig = nullptr) const; 310 311 typedef std::pair<Loc, SVal> FrameBindingTy; 312 typedef SmallVectorImpl<FrameBindingTy> BindingsTy; 313 314 /// Populates the given SmallVector with the bindings in the callee's stack 315 /// frame at the start of this call. 316 virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, 317 BindingsTy &Bindings) const = 0; 318 319 /// Returns a copy of this CallEvent, but using the given state. 320 template <typename T> 321 CallEventRef<T> cloneWithState(ProgramStateRef NewState) const; 322 323 /// Returns a copy of this CallEvent, but using the given state. 324 CallEventRef<> cloneWithState(ProgramStateRef NewState) const { 325 return cloneWithState<CallEvent>(NewState); 326 } 327 328 /// \brief Returns true if this is a statement is a function or method call 329 /// of some kind. 330 static bool isCallStmt(const Stmt *S); 331 332 /// \brief Returns the result type of a function or method declaration. 333 /// 334 /// This will return a null QualType if the result type cannot be determined. 335 static QualType getDeclaredResultType(const Decl *D); 336 337 /// \brief Returns true if the given decl is known to be variadic. 338 /// 339 /// \p D must not be null. 340 static bool isVariadic(const Decl *D); 341 342 // Iterator access to formal parameters and their types. 343 private: 344 typedef std::const_mem_fun_t<QualType, ParmVarDecl> get_type_fun; 345 346 public: 347 /// Return call's formal parameters. 348 /// 349 /// Remember that the number of formal parameters may not match the number 350 /// of arguments for all calls. However, the first parameter will always 351 /// correspond with the argument value returned by \c getArgSVal(0). 352 virtual ArrayRef<ParmVarDecl*> parameters() const = 0; 353 354 typedef llvm::mapped_iterator<ArrayRef<ParmVarDecl*>::iterator, get_type_fun> 355 param_type_iterator; 356 357 /// Returns an iterator over the types of the call's formal parameters. 358 /// 359 /// This uses the callee decl found by default name lookup rather than the 360 /// definition because it represents a public interface, and probably has 361 /// more annotations. 362 param_type_iterator param_type_begin() const { 363 return llvm::map_iterator(parameters().begin(), 364 get_type_fun(&ParmVarDecl::getType)); 365 } 366 /// \sa param_type_begin() 367 param_type_iterator param_type_end() const { 368 return llvm::map_iterator(parameters().end(), 369 get_type_fun(&ParmVarDecl::getType)); 370 } 371 372 // For debugging purposes only 373 void dump(raw_ostream &Out) const; 374 void dump() const; 375 }; 376 377 378 /// \brief Represents a call to any sort of function that might have a 379 /// FunctionDecl. 380 class AnyFunctionCall : public CallEvent { 381 protected: 382 AnyFunctionCall(const Expr *E, ProgramStateRef St, 383 const LocationContext *LCtx) 384 : CallEvent(E, St, LCtx) {} 385 AnyFunctionCall(const Decl *D, ProgramStateRef St, 386 const LocationContext *LCtx) 387 : CallEvent(D, St, LCtx) {} 388 AnyFunctionCall(const AnyFunctionCall &Other) : CallEvent(Other) {} 389 390 public: 391 // This function is overridden by subclasses, but they must return 392 // a FunctionDecl. 393 const FunctionDecl *getDecl() const override { 394 return cast<FunctionDecl>(CallEvent::getDecl()); 395 } 396 397 RuntimeDefinition getRuntimeDefinition() const override { 398 const FunctionDecl *FD = getDecl(); 399 // Note that the AnalysisDeclContext will have the FunctionDecl with 400 // the definition (if one exists). 401 if (FD) { 402 AnalysisDeclContext *AD = 403 getLocationContext()->getAnalysisDeclContext()-> 404 getManager()->getContext(FD); 405 if (AD->getBody()) 406 return RuntimeDefinition(AD->getDecl()); 407 } 408 409 return RuntimeDefinition(); 410 } 411 412 bool argumentsMayEscape() const override; 413 414 void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, 415 BindingsTy &Bindings) const override; 416 417 ArrayRef<ParmVarDecl *> parameters() const override; 418 419 static bool classof(const CallEvent *CA) { 420 return CA->getKind() >= CE_BEG_FUNCTION_CALLS && 421 CA->getKind() <= CE_END_FUNCTION_CALLS; 422 } 423 }; 424 425 /// \brief Represents a C function or static C++ member function call. 426 /// 427 /// Example: \c fun() 428 class SimpleFunctionCall : public AnyFunctionCall { 429 friend class CallEventManager; 430 431 protected: 432 SimpleFunctionCall(const CallExpr *CE, ProgramStateRef St, 433 const LocationContext *LCtx) 434 : AnyFunctionCall(CE, St, LCtx) {} 435 SimpleFunctionCall(const SimpleFunctionCall &Other) 436 : AnyFunctionCall(Other) {} 437 void cloneTo(void *Dest) const override { 438 new (Dest) SimpleFunctionCall(*this); 439 } 440 441 public: 442 virtual const CallExpr *getOriginExpr() const { 443 return cast<CallExpr>(AnyFunctionCall::getOriginExpr()); 444 } 445 446 const FunctionDecl *getDecl() const override; 447 448 unsigned getNumArgs() const override { return getOriginExpr()->getNumArgs(); } 449 450 const Expr *getArgExpr(unsigned Index) const override { 451 return getOriginExpr()->getArg(Index); 452 } 453 454 Kind getKind() const override { return CE_Function; } 455 456 static bool classof(const CallEvent *CA) { 457 return CA->getKind() == CE_Function; 458 } 459 }; 460 461 /// \brief Represents a call to a block. 462 /// 463 /// Example: <tt>^{ /* ... */ }()</tt> 464 class BlockCall : public CallEvent { 465 friend class CallEventManager; 466 467 protected: 468 BlockCall(const CallExpr *CE, ProgramStateRef St, 469 const LocationContext *LCtx) 470 : CallEvent(CE, St, LCtx) {} 471 472 BlockCall(const BlockCall &Other) : CallEvent(Other) {} 473 void cloneTo(void *Dest) const override { new (Dest) BlockCall(*this); } 474 475 void getExtraInvalidatedValues(ValueList &Values) const override; 476 477 public: 478 virtual const CallExpr *getOriginExpr() const { 479 return cast<CallExpr>(CallEvent::getOriginExpr()); 480 } 481 482 unsigned getNumArgs() const override { return getOriginExpr()->getNumArgs(); } 483 484 const Expr *getArgExpr(unsigned Index) const override { 485 return getOriginExpr()->getArg(Index); 486 } 487 488 /// \brief Returns the region associated with this instance of the block. 489 /// 490 /// This may be NULL if the block's origin is unknown. 491 const BlockDataRegion *getBlockRegion() const; 492 493 const BlockDecl *getDecl() const override { 494 const BlockDataRegion *BR = getBlockRegion(); 495 if (!BR) 496 return nullptr; 497 return BR->getDecl(); 498 } 499 500 RuntimeDefinition getRuntimeDefinition() const override { 501 return RuntimeDefinition(getDecl()); 502 } 503 504 bool argumentsMayEscape() const override { 505 return true; 506 } 507 508 void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, 509 BindingsTy &Bindings) const override; 510 511 ArrayRef<ParmVarDecl*> parameters() const override; 512 513 Kind getKind() const override { return CE_Block; } 514 515 static bool classof(const CallEvent *CA) { 516 return CA->getKind() == CE_Block; 517 } 518 }; 519 520 /// \brief Represents a non-static C++ member function call, no matter how 521 /// it is written. 522 class CXXInstanceCall : public AnyFunctionCall { 523 protected: 524 void getExtraInvalidatedValues(ValueList &Values) const override; 525 526 CXXInstanceCall(const CallExpr *CE, ProgramStateRef St, 527 const LocationContext *LCtx) 528 : AnyFunctionCall(CE, St, LCtx) {} 529 CXXInstanceCall(const FunctionDecl *D, ProgramStateRef St, 530 const LocationContext *LCtx) 531 : AnyFunctionCall(D, St, LCtx) {} 532 533 534 CXXInstanceCall(const CXXInstanceCall &Other) : AnyFunctionCall(Other) {} 535 536 public: 537 /// \brief Returns the expression representing the implicit 'this' object. 538 virtual const Expr *getCXXThisExpr() const { return nullptr; } 539 540 /// \brief Returns the value of the implicit 'this' object. 541 virtual SVal getCXXThisVal() const; 542 543 const FunctionDecl *getDecl() const override; 544 545 RuntimeDefinition getRuntimeDefinition() const override; 546 547 void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, 548 BindingsTy &Bindings) const override; 549 550 static bool classof(const CallEvent *CA) { 551 return CA->getKind() >= CE_BEG_CXX_INSTANCE_CALLS && 552 CA->getKind() <= CE_END_CXX_INSTANCE_CALLS; 553 } 554 }; 555 556 /// \brief Represents a non-static C++ member function call. 557 /// 558 /// Example: \c obj.fun() 559 class CXXMemberCall : public CXXInstanceCall { 560 friend class CallEventManager; 561 562 protected: 563 CXXMemberCall(const CXXMemberCallExpr *CE, ProgramStateRef St, 564 const LocationContext *LCtx) 565 : CXXInstanceCall(CE, St, LCtx) {} 566 567 CXXMemberCall(const CXXMemberCall &Other) : CXXInstanceCall(Other) {} 568 void cloneTo(void *Dest) const override { new (Dest) CXXMemberCall(*this); } 569 570 public: 571 virtual const CXXMemberCallExpr *getOriginExpr() const { 572 return cast<CXXMemberCallExpr>(CXXInstanceCall::getOriginExpr()); 573 } 574 575 unsigned getNumArgs() const override { 576 if (const CallExpr *CE = getOriginExpr()) 577 return CE->getNumArgs(); 578 return 0; 579 } 580 581 const Expr *getArgExpr(unsigned Index) const override { 582 return getOriginExpr()->getArg(Index); 583 } 584 585 const Expr *getCXXThisExpr() const override; 586 587 RuntimeDefinition getRuntimeDefinition() const override; 588 589 Kind getKind() const override { return CE_CXXMember; } 590 591 static bool classof(const CallEvent *CA) { 592 return CA->getKind() == CE_CXXMember; 593 } 594 }; 595 596 /// \brief Represents a C++ overloaded operator call where the operator is 597 /// implemented as a non-static member function. 598 /// 599 /// Example: <tt>iter + 1</tt> 600 class CXXMemberOperatorCall : public CXXInstanceCall { 601 friend class CallEventManager; 602 603 protected: 604 CXXMemberOperatorCall(const CXXOperatorCallExpr *CE, ProgramStateRef St, 605 const LocationContext *LCtx) 606 : CXXInstanceCall(CE, St, LCtx) {} 607 608 CXXMemberOperatorCall(const CXXMemberOperatorCall &Other) 609 : CXXInstanceCall(Other) {} 610 void cloneTo(void *Dest) const override { 611 new (Dest) CXXMemberOperatorCall(*this); 612 } 613 614 public: 615 virtual const CXXOperatorCallExpr *getOriginExpr() const { 616 return cast<CXXOperatorCallExpr>(CXXInstanceCall::getOriginExpr()); 617 } 618 619 unsigned getNumArgs() const override { 620 return getOriginExpr()->getNumArgs() - 1; 621 } 622 const Expr *getArgExpr(unsigned Index) const override { 623 return getOriginExpr()->getArg(Index + 1); 624 } 625 626 const Expr *getCXXThisExpr() const override; 627 628 Kind getKind() const override { return CE_CXXMemberOperator; } 629 630 static bool classof(const CallEvent *CA) { 631 return CA->getKind() == CE_CXXMemberOperator; 632 } 633 }; 634 635 /// \brief Represents an implicit call to a C++ destructor. 636 /// 637 /// This can occur at the end of a scope (for automatic objects), at the end 638 /// of a full-expression (for temporaries), or as part of a delete. 639 class CXXDestructorCall : public CXXInstanceCall { 640 friend class CallEventManager; 641 642 protected: 643 typedef llvm::PointerIntPair<const MemRegion *, 1, bool> DtorDataTy; 644 645 /// Creates an implicit destructor. 646 /// 647 /// \param DD The destructor that will be called. 648 /// \param Trigger The statement whose completion causes this destructor call. 649 /// \param Target The object region to be destructed. 650 /// \param St The path-sensitive state at this point in the program. 651 /// \param LCtx The location context at this point in the program. 652 CXXDestructorCall(const CXXDestructorDecl *DD, const Stmt *Trigger, 653 const MemRegion *Target, bool IsBaseDestructor, 654 ProgramStateRef St, const LocationContext *LCtx) 655 : CXXInstanceCall(DD, St, LCtx) { 656 Data = DtorDataTy(Target, IsBaseDestructor).getOpaqueValue(); 657 Location = Trigger->getLocEnd(); 658 } 659 660 CXXDestructorCall(const CXXDestructorCall &Other) : CXXInstanceCall(Other) {} 661 void cloneTo(void *Dest) const override {new (Dest) CXXDestructorCall(*this);} 662 663 public: 664 SourceRange getSourceRange() const override { return Location; } 665 unsigned getNumArgs() const override { return 0; } 666 667 RuntimeDefinition getRuntimeDefinition() const override; 668 669 /// \brief Returns the value of the implicit 'this' object. 670 SVal getCXXThisVal() const override; 671 672 /// Returns true if this is a call to a base class destructor. 673 bool isBaseDestructor() const { 674 return DtorDataTy::getFromOpaqueValue(Data).getInt(); 675 } 676 677 Kind getKind() const override { return CE_CXXDestructor; } 678 679 static bool classof(const CallEvent *CA) { 680 return CA->getKind() == CE_CXXDestructor; 681 } 682 }; 683 684 /// \brief Represents a call to a C++ constructor. 685 /// 686 /// Example: \c T(1) 687 class CXXConstructorCall : public AnyFunctionCall { 688 friend class CallEventManager; 689 690 protected: 691 /// Creates a constructor call. 692 /// 693 /// \param CE The constructor expression as written in the source. 694 /// \param Target The region where the object should be constructed. If NULL, 695 /// a new symbolic region will be used. 696 /// \param St The path-sensitive state at this point in the program. 697 /// \param LCtx The location context at this point in the program. 698 CXXConstructorCall(const CXXConstructExpr *CE, const MemRegion *Target, 699 ProgramStateRef St, const LocationContext *LCtx) 700 : AnyFunctionCall(CE, St, LCtx) { 701 Data = Target; 702 } 703 704 CXXConstructorCall(const CXXConstructorCall &Other) : AnyFunctionCall(Other){} 705 void cloneTo(void *Dest) const override { new (Dest) CXXConstructorCall(*this); } 706 707 void getExtraInvalidatedValues(ValueList &Values) const override; 708 709 public: 710 virtual const CXXConstructExpr *getOriginExpr() const { 711 return cast<CXXConstructExpr>(AnyFunctionCall::getOriginExpr()); 712 } 713 714 const CXXConstructorDecl *getDecl() const override { 715 return getOriginExpr()->getConstructor(); 716 } 717 718 unsigned getNumArgs() const override { return getOriginExpr()->getNumArgs(); } 719 720 const Expr *getArgExpr(unsigned Index) const override { 721 return getOriginExpr()->getArg(Index); 722 } 723 724 /// \brief Returns the value of the implicit 'this' object. 725 SVal getCXXThisVal() const; 726 727 void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, 728 BindingsTy &Bindings) const override; 729 730 Kind getKind() const override { return CE_CXXConstructor; } 731 732 static bool classof(const CallEvent *CA) { 733 return CA->getKind() == CE_CXXConstructor; 734 } 735 }; 736 737 /// \brief Represents the memory allocation call in a C++ new-expression. 738 /// 739 /// This is a call to "operator new". 740 class CXXAllocatorCall : public AnyFunctionCall { 741 friend class CallEventManager; 742 743 protected: 744 CXXAllocatorCall(const CXXNewExpr *E, ProgramStateRef St, 745 const LocationContext *LCtx) 746 : AnyFunctionCall(E, St, LCtx) {} 747 748 CXXAllocatorCall(const CXXAllocatorCall &Other) : AnyFunctionCall(Other) {} 749 void cloneTo(void *Dest) const override { new (Dest) CXXAllocatorCall(*this); } 750 751 public: 752 virtual const CXXNewExpr *getOriginExpr() const { 753 return cast<CXXNewExpr>(AnyFunctionCall::getOriginExpr()); 754 } 755 756 const FunctionDecl *getDecl() const override { 757 return getOriginExpr()->getOperatorNew(); 758 } 759 760 unsigned getNumArgs() const override { 761 return getOriginExpr()->getNumPlacementArgs() + 1; 762 } 763 764 const Expr *getArgExpr(unsigned Index) const override { 765 // The first argument of an allocator call is the size of the allocation. 766 if (Index == 0) 767 return nullptr; 768 return getOriginExpr()->getPlacementArg(Index - 1); 769 } 770 771 Kind getKind() const override { return CE_CXXAllocator; } 772 773 static bool classof(const CallEvent *CE) { 774 return CE->getKind() == CE_CXXAllocator; 775 } 776 }; 777 778 /// \brief Represents the ways an Objective-C message send can occur. 779 // 780 // Note to maintainers: OCM_Message should always be last, since it does not 781 // need to fit in the Data field's low bits. 782 enum ObjCMessageKind { 783 OCM_PropertyAccess, 784 OCM_Subscript, 785 OCM_Message 786 }; 787 788 /// \brief Represents any expression that calls an Objective-C method. 789 /// 790 /// This includes all of the kinds listed in ObjCMessageKind. 791 class ObjCMethodCall : public CallEvent { 792 friend class CallEventManager; 793 794 const PseudoObjectExpr *getContainingPseudoObjectExpr() const; 795 796 protected: 797 ObjCMethodCall(const ObjCMessageExpr *Msg, ProgramStateRef St, 798 const LocationContext *LCtx) 799 : CallEvent(Msg, St, LCtx) { 800 Data = nullptr; 801 } 802 803 ObjCMethodCall(const ObjCMethodCall &Other) : CallEvent(Other) {} 804 void cloneTo(void *Dest) const override { new (Dest) ObjCMethodCall(*this); } 805 806 void getExtraInvalidatedValues(ValueList &Values) const override; 807 808 /// Check if the selector may have multiple definitions (may have overrides). 809 virtual bool canBeOverridenInSubclass(ObjCInterfaceDecl *IDecl, 810 Selector Sel) const; 811 812 public: 813 virtual const ObjCMessageExpr *getOriginExpr() const { 814 return cast<ObjCMessageExpr>(CallEvent::getOriginExpr()); 815 } 816 const ObjCMethodDecl *getDecl() const override { 817 return getOriginExpr()->getMethodDecl(); 818 } 819 unsigned getNumArgs() const override { 820 return getOriginExpr()->getNumArgs(); 821 } 822 const Expr *getArgExpr(unsigned Index) const override { 823 return getOriginExpr()->getArg(Index); 824 } 825 826 bool isInstanceMessage() const { 827 return getOriginExpr()->isInstanceMessage(); 828 } 829 ObjCMethodFamily getMethodFamily() const { 830 return getOriginExpr()->getMethodFamily(); 831 } 832 Selector getSelector() const { 833 return getOriginExpr()->getSelector(); 834 } 835 836 SourceRange getSourceRange() const override; 837 838 /// \brief Returns the value of the receiver at the time of this call. 839 SVal getReceiverSVal() const; 840 841 /// \brief Return the value of 'self' if available. 842 SVal getSelfSVal() const; 843 844 /// \brief Get the interface for the receiver. 845 /// 846 /// This works whether this is an instance message or a class message. 847 /// However, it currently just uses the static type of the receiver. 848 const ObjCInterfaceDecl *getReceiverInterface() const { 849 return getOriginExpr()->getReceiverInterface(); 850 } 851 852 /// \brief Checks if the receiver refers to 'self' or 'super'. 853 bool isReceiverSelfOrSuper() const; 854 855 /// Returns how the message was written in the source (property access, 856 /// subscript, or explicit message send). 857 ObjCMessageKind getMessageKind() const; 858 859 /// Returns true if this property access or subscript is a setter (has the 860 /// form of an assignment). 861 bool isSetter() const { 862 switch (getMessageKind()) { 863 case OCM_Message: 864 llvm_unreachable("This is not a pseudo-object access!"); 865 case OCM_PropertyAccess: 866 return getNumArgs() > 0; 867 case OCM_Subscript: 868 return getNumArgs() > 1; 869 } 870 llvm_unreachable("Unknown message kind"); 871 } 872 873 RuntimeDefinition getRuntimeDefinition() const override; 874 875 bool argumentsMayEscape() const override; 876 877 void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, 878 BindingsTy &Bindings) const override; 879 880 ArrayRef<ParmVarDecl*> parameters() const override; 881 882 Kind getKind() const override { return CE_ObjCMessage; } 883 884 static bool classof(const CallEvent *CA) { 885 return CA->getKind() == CE_ObjCMessage; 886 } 887 }; 888 889 890 /// \brief Manages the lifetime of CallEvent objects. 891 /// 892 /// CallEventManager provides a way to create arbitrary CallEvents "on the 893 /// stack" as if they were value objects by keeping a cache of CallEvent-sized 894 /// memory blocks. The CallEvents created by CallEventManager are only valid 895 /// for the lifetime of the OwnedCallEvent that holds them; right now these 896 /// objects cannot be copied and ownership cannot be transferred. 897 class CallEventManager { 898 friend class CallEvent; 899 900 llvm::BumpPtrAllocator &Alloc; 901 SmallVector<void *, 8> Cache; 902 typedef SimpleFunctionCall CallEventTemplateTy; 903 904 void reclaim(const void *Memory) { 905 Cache.push_back(const_cast<void *>(Memory)); 906 } 907 908 /// Returns memory that can be initialized as a CallEvent. 909 void *allocate() { 910 if (Cache.empty()) 911 return Alloc.Allocate<CallEventTemplateTy>(); 912 else 913 return Cache.pop_back_val(); 914 } 915 916 template <typename T, typename Arg> 917 T *create(Arg A, ProgramStateRef St, const LocationContext *LCtx) { 918 static_assert(sizeof(T) == sizeof(CallEventTemplateTy), 919 "CallEvent subclasses are not all the same size"); 920 return new (allocate()) T(A, St, LCtx); 921 } 922 923 template <typename T, typename Arg1, typename Arg2> 924 T *create(Arg1 A1, Arg2 A2, ProgramStateRef St, const LocationContext *LCtx) { 925 static_assert(sizeof(T) == sizeof(CallEventTemplateTy), 926 "CallEvent subclasses are not all the same size"); 927 return new (allocate()) T(A1, A2, St, LCtx); 928 } 929 930 template <typename T, typename Arg1, typename Arg2, typename Arg3> 931 T *create(Arg1 A1, Arg2 A2, Arg3 A3, ProgramStateRef St, 932 const LocationContext *LCtx) { 933 static_assert(sizeof(T) == sizeof(CallEventTemplateTy), 934 "CallEvent subclasses are not all the same size"); 935 return new (allocate()) T(A1, A2, A3, St, LCtx); 936 } 937 938 template <typename T, typename Arg1, typename Arg2, typename Arg3, 939 typename Arg4> 940 T *create(Arg1 A1, Arg2 A2, Arg3 A3, Arg4 A4, ProgramStateRef St, 941 const LocationContext *LCtx) { 942 static_assert(sizeof(T) == sizeof(CallEventTemplateTy), 943 "CallEvent subclasses are not all the same size"); 944 return new (allocate()) T(A1, A2, A3, A4, St, LCtx); 945 } 946 947 public: 948 CallEventManager(llvm::BumpPtrAllocator &alloc) : Alloc(alloc) {} 949 950 951 CallEventRef<> 952 getCaller(const StackFrameContext *CalleeCtx, ProgramStateRef State); 953 954 955 CallEventRef<> 956 getSimpleCall(const CallExpr *E, ProgramStateRef State, 957 const LocationContext *LCtx); 958 959 CallEventRef<ObjCMethodCall> 960 getObjCMethodCall(const ObjCMessageExpr *E, ProgramStateRef State, 961 const LocationContext *LCtx) { 962 return create<ObjCMethodCall>(E, State, LCtx); 963 } 964 965 CallEventRef<CXXConstructorCall> 966 getCXXConstructorCall(const CXXConstructExpr *E, const MemRegion *Target, 967 ProgramStateRef State, const LocationContext *LCtx) { 968 return create<CXXConstructorCall>(E, Target, State, LCtx); 969 } 970 971 CallEventRef<CXXDestructorCall> 972 getCXXDestructorCall(const CXXDestructorDecl *DD, const Stmt *Trigger, 973 const MemRegion *Target, bool IsBase, 974 ProgramStateRef State, const LocationContext *LCtx) { 975 return create<CXXDestructorCall>(DD, Trigger, Target, IsBase, State, LCtx); 976 } 977 978 CallEventRef<CXXAllocatorCall> 979 getCXXAllocatorCall(const CXXNewExpr *E, ProgramStateRef State, 980 const LocationContext *LCtx) { 981 return create<CXXAllocatorCall>(E, State, LCtx); 982 } 983 }; 984 985 986 template <typename T> 987 CallEventRef<T> CallEvent::cloneWithState(ProgramStateRef NewState) const { 988 assert(isa<T>(*this) && "Cloning to unrelated type"); 989 static_assert(sizeof(T) == sizeof(CallEvent), 990 "Subclasses may not add fields"); 991 992 if (NewState == State) 993 return cast<T>(this); 994 995 CallEventManager &Mgr = State->getStateManager().getCallEventManager(); 996 T *Copy = static_cast<T *>(Mgr.allocate()); 997 cloneTo(Copy); 998 assert(Copy->getKind() == this->getKind() && "Bad copy"); 999 1000 Copy->State = NewState; 1001 return Copy; 1002 } 1003 1004 inline void CallEvent::Release() const { 1005 assert(RefCount > 0 && "Reference count is already zero."); 1006 --RefCount; 1007 1008 if (RefCount > 0) 1009 return; 1010 1011 CallEventManager &Mgr = State->getStateManager().getCallEventManager(); 1012 Mgr.reclaim(this); 1013 1014 this->~CallEvent(); 1015 } 1016 1017 } // end namespace ento 1018 } // end namespace clang 1019 1020 namespace llvm { 1021 // Support isa<>, cast<>, and dyn_cast<> for CallEventRef. 1022 template<class T> struct simplify_type< clang::ento::CallEventRef<T> > { 1023 typedef const T *SimpleType; 1024 1025 static SimpleType 1026 getSimplifiedValue(clang::ento::CallEventRef<T> Val) { 1027 return Val.get(); 1028 } 1029 }; 1030 } 1031 1032 #endif 1033