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_CORE_PATHSENSITIVE_CALLEVENT_H 17 #define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_CALLEVENT_H 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 &) = delete; 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, 168 RegionAndSymbolInvalidationTraits *ETraits) const {} 169 170 public: 171 virtual ~CallEvent() {} 172 173 /// \brief Returns the kind of call this is. 174 virtual Kind getKind() const = 0; 175 176 /// \brief Returns the declaration of the function or method that will be 177 /// called. May be null. 178 virtual const Decl *getDecl() const { 179 return Origin.dyn_cast<const Decl *>(); 180 } 181 182 /// \brief The state in which the call is being evaluated. 183 const ProgramStateRef &getState() const { 184 return State; 185 } 186 187 /// \brief The context in which the call is being evaluated. 188 const LocationContext *getLocationContext() const { 189 return LCtx; 190 } 191 192 /// \brief Returns the definition of the function or method that will be 193 /// called. 194 virtual RuntimeDefinition getRuntimeDefinition() const = 0; 195 196 /// \brief Returns the expression whose value will be the result of this call. 197 /// May be null. 198 const Expr *getOriginExpr() const { 199 return Origin.dyn_cast<const Expr *>(); 200 } 201 202 /// \brief Returns the number of arguments (explicit and implicit). 203 /// 204 /// Note that this may be greater than the number of parameters in the 205 /// callee's declaration, and that it may include arguments not written in 206 /// the source. 207 virtual unsigned getNumArgs() const = 0; 208 209 /// \brief Returns true if the callee is known to be from a system header. 210 bool isInSystemHeader() const { 211 const Decl *D = getDecl(); 212 if (!D) 213 return false; 214 215 SourceLocation Loc = D->getLocation(); 216 if (Loc.isValid()) { 217 const SourceManager &SM = 218 getState()->getStateManager().getContext().getSourceManager(); 219 return SM.isInSystemHeader(D->getLocation()); 220 } 221 222 // Special case for implicitly-declared global operator new/delete. 223 // These should be considered system functions. 224 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) 225 return FD->isOverloadedOperator() && FD->isImplicit() && FD->isGlobal(); 226 227 return false; 228 } 229 230 /// \brief Returns a source range for the entire call, suitable for 231 /// outputting in diagnostics. 232 virtual SourceRange getSourceRange() const { 233 return getOriginExpr()->getSourceRange(); 234 } 235 236 /// \brief Returns the value of a given argument at the time of the call. 237 virtual SVal getArgSVal(unsigned Index) const; 238 239 /// \brief Returns the expression associated with a given argument. 240 /// May be null if this expression does not appear in the source. 241 virtual const Expr *getArgExpr(unsigned Index) const { return nullptr; } 242 243 /// \brief Returns the source range for errors associated with this argument. 244 /// 245 /// May be invalid if the argument is not written in the source. 246 virtual SourceRange getArgSourceRange(unsigned Index) const; 247 248 /// \brief Returns the result type, adjusted for references. 249 QualType getResultType() const; 250 251 /// \brief Returns the return value of the call. 252 /// 253 /// This should only be called if the CallEvent was created using a state in 254 /// which the return value has already been bound to the origin expression. 255 SVal getReturnValue() const; 256 257 /// \brief Returns true if the type of any of the non-null arguments satisfies 258 /// the condition. 259 bool hasNonNullArgumentsWithType(bool (*Condition)(QualType)) const; 260 261 /// \brief Returns true if any of the arguments appear to represent callbacks. 262 bool hasNonZeroCallbackArg() const; 263 264 /// \brief Returns true if any of the arguments is void*. 265 bool hasVoidPointerToNonConstArg() const; 266 267 /// \brief Returns true if any of the arguments are known to escape to long- 268 /// term storage, even if this method will not modify them. 269 // NOTE: The exact semantics of this are still being defined! 270 // We don't really want a list of hardcoded exceptions in the long run, 271 // but we don't want duplicated lists of known APIs in the short term either. 272 virtual bool argumentsMayEscape() const { 273 return hasNonZeroCallbackArg(); 274 } 275 276 /// \brief Returns true if the callee is an externally-visible function in the 277 /// top-level namespace, such as \c malloc. 278 /// 279 /// You can use this call to determine that a particular function really is 280 /// a library function and not, say, a C++ member function with the same name. 281 /// 282 /// If a name is provided, the function must additionally match the given 283 /// name. 284 /// 285 /// Note that this deliberately excludes C++ library functions in the \c std 286 /// namespace, but will include C library functions accessed through the 287 /// \c std namespace. This also does not check if the function is declared 288 /// as 'extern "C"', or if it uses C++ name mangling. 289 // FIXME: Add a helper for checking namespaces. 290 // FIXME: Move this down to AnyFunctionCall once checkers have more 291 // precise callbacks. 292 bool isGlobalCFunction(StringRef SpecificName = StringRef()) const; 293 294 /// \brief Returns the name of the callee, if its name is a simple identifier. 295 /// 296 /// Note that this will fail for Objective-C methods, blocks, and C++ 297 /// overloaded operators. The former is named by a Selector rather than a 298 /// simple identifier, and the latter two do not have names. 299 // FIXME: Move this down to AnyFunctionCall once checkers have more 300 // precise callbacks. 301 const IdentifierInfo *getCalleeIdentifier() const { 302 const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(getDecl()); 303 if (!ND) 304 return nullptr; 305 return ND->getIdentifier(); 306 } 307 308 /// \brief Returns an appropriate ProgramPoint for this call. 309 ProgramPoint getProgramPoint(bool IsPreVisit = false, 310 const ProgramPointTag *Tag = nullptr) const; 311 312 /// \brief Returns a new state with all argument regions invalidated. 313 /// 314 /// This accepts an alternate state in case some processing has already 315 /// occurred. 316 ProgramStateRef invalidateRegions(unsigned BlockCount, 317 ProgramStateRef Orig = nullptr) const; 318 319 typedef std::pair<Loc, SVal> FrameBindingTy; 320 typedef SmallVectorImpl<FrameBindingTy> BindingsTy; 321 322 /// Populates the given SmallVector with the bindings in the callee's stack 323 /// frame at the start of this call. 324 virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, 325 BindingsTy &Bindings) const = 0; 326 327 /// Returns a copy of this CallEvent, but using the given state. 328 template <typename T> 329 CallEventRef<T> cloneWithState(ProgramStateRef NewState) const; 330 331 /// Returns a copy of this CallEvent, but using the given state. 332 CallEventRef<> cloneWithState(ProgramStateRef NewState) const { 333 return cloneWithState<CallEvent>(NewState); 334 } 335 336 /// \brief Returns true if this is a statement is a function or method call 337 /// of some kind. 338 static bool isCallStmt(const Stmt *S); 339 340 /// \brief Returns the result type of a function or method declaration. 341 /// 342 /// This will return a null QualType if the result type cannot be determined. 343 static QualType getDeclaredResultType(const Decl *D); 344 345 /// \brief Returns true if the given decl is known to be variadic. 346 /// 347 /// \p D must not be null. 348 static bool isVariadic(const Decl *D); 349 350 // Iterator access to formal parameters and their types. 351 private: 352 typedef std::const_mem_fun_t<QualType, ParmVarDecl> get_type_fun; 353 354 public: 355 /// Return call's formal parameters. 356 /// 357 /// Remember that the number of formal parameters may not match the number 358 /// of arguments for all calls. However, the first parameter will always 359 /// correspond with the argument value returned by \c getArgSVal(0). 360 virtual ArrayRef<ParmVarDecl*> parameters() const = 0; 361 362 typedef llvm::mapped_iterator<ArrayRef<ParmVarDecl*>::iterator, get_type_fun> 363 param_type_iterator; 364 365 /// Returns an iterator over the types of the call's formal parameters. 366 /// 367 /// This uses the callee decl found by default name lookup rather than the 368 /// definition because it represents a public interface, and probably has 369 /// more annotations. 370 param_type_iterator param_type_begin() const { 371 return llvm::map_iterator(parameters().begin(), 372 get_type_fun(&ParmVarDecl::getType)); 373 } 374 /// \sa param_type_begin() 375 param_type_iterator param_type_end() const { 376 return llvm::map_iterator(parameters().end(), 377 get_type_fun(&ParmVarDecl::getType)); 378 } 379 380 // For debugging purposes only 381 void dump(raw_ostream &Out) const; 382 void dump() const; 383 }; 384 385 386 /// \brief Represents a call to any sort of function that might have a 387 /// FunctionDecl. 388 class AnyFunctionCall : public CallEvent { 389 protected: 390 AnyFunctionCall(const Expr *E, ProgramStateRef St, 391 const LocationContext *LCtx) 392 : CallEvent(E, St, LCtx) {} 393 AnyFunctionCall(const Decl *D, ProgramStateRef St, 394 const LocationContext *LCtx) 395 : CallEvent(D, St, LCtx) {} 396 AnyFunctionCall(const AnyFunctionCall &Other) : CallEvent(Other) {} 397 398 public: 399 // This function is overridden by subclasses, but they must return 400 // a FunctionDecl. 401 const FunctionDecl *getDecl() const override { 402 return cast<FunctionDecl>(CallEvent::getDecl()); 403 } 404 405 RuntimeDefinition getRuntimeDefinition() const override { 406 const FunctionDecl *FD = getDecl(); 407 // Note that the AnalysisDeclContext will have the FunctionDecl with 408 // the definition (if one exists). 409 if (FD) { 410 AnalysisDeclContext *AD = 411 getLocationContext()->getAnalysisDeclContext()-> 412 getManager()->getContext(FD); 413 if (AD->getBody()) 414 return RuntimeDefinition(AD->getDecl()); 415 } 416 417 return RuntimeDefinition(); 418 } 419 420 bool argumentsMayEscape() const override; 421 422 void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, 423 BindingsTy &Bindings) const override; 424 425 ArrayRef<ParmVarDecl *> parameters() const override; 426 427 static bool classof(const CallEvent *CA) { 428 return CA->getKind() >= CE_BEG_FUNCTION_CALLS && 429 CA->getKind() <= CE_END_FUNCTION_CALLS; 430 } 431 }; 432 433 /// \brief Represents a C function or static C++ member function call. 434 /// 435 /// Example: \c fun() 436 class SimpleFunctionCall : public AnyFunctionCall { 437 friend class CallEventManager; 438 439 protected: 440 SimpleFunctionCall(const CallExpr *CE, ProgramStateRef St, 441 const LocationContext *LCtx) 442 : AnyFunctionCall(CE, St, LCtx) {} 443 SimpleFunctionCall(const SimpleFunctionCall &Other) 444 : AnyFunctionCall(Other) {} 445 void cloneTo(void *Dest) const override { 446 new (Dest) SimpleFunctionCall(*this); 447 } 448 449 public: 450 virtual const CallExpr *getOriginExpr() const { 451 return cast<CallExpr>(AnyFunctionCall::getOriginExpr()); 452 } 453 454 const FunctionDecl *getDecl() const override; 455 456 unsigned getNumArgs() const override { return getOriginExpr()->getNumArgs(); } 457 458 const Expr *getArgExpr(unsigned Index) const override { 459 return getOriginExpr()->getArg(Index); 460 } 461 462 Kind getKind() const override { return CE_Function; } 463 464 static bool classof(const CallEvent *CA) { 465 return CA->getKind() == CE_Function; 466 } 467 }; 468 469 /// \brief Represents a call to a block. 470 /// 471 /// Example: <tt>^{ /* ... */ }()</tt> 472 class BlockCall : public CallEvent { 473 friend class CallEventManager; 474 475 protected: 476 BlockCall(const CallExpr *CE, ProgramStateRef St, 477 const LocationContext *LCtx) 478 : CallEvent(CE, St, LCtx) {} 479 480 BlockCall(const BlockCall &Other) : CallEvent(Other) {} 481 void cloneTo(void *Dest) const override { new (Dest) BlockCall(*this); } 482 483 void getExtraInvalidatedValues(ValueList &Values, 484 RegionAndSymbolInvalidationTraits *ETraits) const override; 485 486 public: 487 virtual const CallExpr *getOriginExpr() const { 488 return cast<CallExpr>(CallEvent::getOriginExpr()); 489 } 490 491 unsigned getNumArgs() const override { return getOriginExpr()->getNumArgs(); } 492 493 const Expr *getArgExpr(unsigned Index) const override { 494 return getOriginExpr()->getArg(Index); 495 } 496 497 /// \brief Returns the region associated with this instance of the block. 498 /// 499 /// This may be NULL if the block's origin is unknown. 500 const BlockDataRegion *getBlockRegion() const; 501 502 const BlockDecl *getDecl() const override { 503 const BlockDataRegion *BR = getBlockRegion(); 504 if (!BR) 505 return nullptr; 506 return BR->getDecl(); 507 } 508 509 bool isConversionFromLambda() const { 510 const BlockDecl *BD = getDecl(); 511 if (!BD) 512 return false; 513 514 return BD->isConversionFromLambda(); 515 } 516 517 /// \brief For a block converted from a C++ lambda, returns the block 518 /// VarRegion for the variable holding the captured C++ lambda record. 519 const VarRegion *getRegionStoringCapturedLambda() const { 520 assert(isConversionFromLambda()); 521 const BlockDataRegion *BR = getBlockRegion(); 522 assert(BR && "Block converted from lambda must have a block region"); 523 524 auto I = BR->referenced_vars_begin(); 525 assert(I != BR->referenced_vars_end()); 526 527 return I.getCapturedRegion(); 528 } 529 530 RuntimeDefinition getRuntimeDefinition() const override { 531 if (!isConversionFromLambda()) 532 return RuntimeDefinition(getDecl()); 533 534 // Clang converts lambdas to blocks with an implicit user-defined 535 // conversion operator method on the lambda record that looks (roughly) 536 // like: 537 // 538 // typedef R(^block_type)(P1, P2, ...); 539 // operator block_type() const { 540 // auto Lambda = *this; 541 // return ^(P1 p1, P2 p2, ...){ 542 // /* return Lambda(p1, p2, ...); */ 543 // }; 544 // } 545 // 546 // Here R is the return type of the lambda and P1, P2, ... are 547 // its parameter types. 'Lambda' is a fake VarDecl captured by the block 548 // that is initialized to a copy of the lambda. 549 // 550 // Sema leaves the body of a lambda-converted block empty (it is 551 // produced by CodeGen), so we can't analyze it directly. Instead, we skip 552 // the block body and analyze the operator() method on the captured lambda. 553 const VarDecl *LambdaVD = getRegionStoringCapturedLambda()->getDecl(); 554 const CXXRecordDecl *LambdaDecl = LambdaVD->getType()->getAsCXXRecordDecl(); 555 CXXMethodDecl* LambdaCallOperator = LambdaDecl->getLambdaCallOperator(); 556 557 return RuntimeDefinition(LambdaCallOperator); 558 } 559 560 bool argumentsMayEscape() const override { 561 return true; 562 } 563 564 void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, 565 BindingsTy &Bindings) const override; 566 567 ArrayRef<ParmVarDecl*> parameters() const override; 568 569 Kind getKind() const override { return CE_Block; } 570 571 static bool classof(const CallEvent *CA) { 572 return CA->getKind() == CE_Block; 573 } 574 }; 575 576 /// \brief Represents a non-static C++ member function call, no matter how 577 /// it is written. 578 class CXXInstanceCall : public AnyFunctionCall { 579 protected: 580 void getExtraInvalidatedValues(ValueList &Values, 581 RegionAndSymbolInvalidationTraits *ETraits) const override; 582 583 CXXInstanceCall(const CallExpr *CE, ProgramStateRef St, 584 const LocationContext *LCtx) 585 : AnyFunctionCall(CE, St, LCtx) {} 586 CXXInstanceCall(const FunctionDecl *D, ProgramStateRef St, 587 const LocationContext *LCtx) 588 : AnyFunctionCall(D, St, LCtx) {} 589 590 591 CXXInstanceCall(const CXXInstanceCall &Other) : AnyFunctionCall(Other) {} 592 593 public: 594 /// \brief Returns the expression representing the implicit 'this' object. 595 virtual const Expr *getCXXThisExpr() const { return nullptr; } 596 597 /// \brief Returns the value of the implicit 'this' object. 598 virtual SVal getCXXThisVal() const; 599 600 const FunctionDecl *getDecl() const override; 601 602 RuntimeDefinition getRuntimeDefinition() const override; 603 604 void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, 605 BindingsTy &Bindings) const override; 606 607 static bool classof(const CallEvent *CA) { 608 return CA->getKind() >= CE_BEG_CXX_INSTANCE_CALLS && 609 CA->getKind() <= CE_END_CXX_INSTANCE_CALLS; 610 } 611 }; 612 613 /// \brief Represents a non-static C++ member function call. 614 /// 615 /// Example: \c obj.fun() 616 class CXXMemberCall : public CXXInstanceCall { 617 friend class CallEventManager; 618 619 protected: 620 CXXMemberCall(const CXXMemberCallExpr *CE, ProgramStateRef St, 621 const LocationContext *LCtx) 622 : CXXInstanceCall(CE, St, LCtx) {} 623 624 CXXMemberCall(const CXXMemberCall &Other) : CXXInstanceCall(Other) {} 625 void cloneTo(void *Dest) const override { new (Dest) CXXMemberCall(*this); } 626 627 public: 628 virtual const CXXMemberCallExpr *getOriginExpr() const { 629 return cast<CXXMemberCallExpr>(CXXInstanceCall::getOriginExpr()); 630 } 631 632 unsigned getNumArgs() const override { 633 if (const CallExpr *CE = getOriginExpr()) 634 return CE->getNumArgs(); 635 return 0; 636 } 637 638 const Expr *getArgExpr(unsigned Index) const override { 639 return getOriginExpr()->getArg(Index); 640 } 641 642 const Expr *getCXXThisExpr() const override; 643 644 RuntimeDefinition getRuntimeDefinition() const override; 645 646 Kind getKind() const override { return CE_CXXMember; } 647 648 static bool classof(const CallEvent *CA) { 649 return CA->getKind() == CE_CXXMember; 650 } 651 }; 652 653 /// \brief Represents a C++ overloaded operator call where the operator is 654 /// implemented as a non-static member function. 655 /// 656 /// Example: <tt>iter + 1</tt> 657 class CXXMemberOperatorCall : public CXXInstanceCall { 658 friend class CallEventManager; 659 660 protected: 661 CXXMemberOperatorCall(const CXXOperatorCallExpr *CE, ProgramStateRef St, 662 const LocationContext *LCtx) 663 : CXXInstanceCall(CE, St, LCtx) {} 664 665 CXXMemberOperatorCall(const CXXMemberOperatorCall &Other) 666 : CXXInstanceCall(Other) {} 667 void cloneTo(void *Dest) const override { 668 new (Dest) CXXMemberOperatorCall(*this); 669 } 670 671 public: 672 virtual const CXXOperatorCallExpr *getOriginExpr() const { 673 return cast<CXXOperatorCallExpr>(CXXInstanceCall::getOriginExpr()); 674 } 675 676 unsigned getNumArgs() const override { 677 return getOriginExpr()->getNumArgs() - 1; 678 } 679 const Expr *getArgExpr(unsigned Index) const override { 680 return getOriginExpr()->getArg(Index + 1); 681 } 682 683 const Expr *getCXXThisExpr() const override; 684 685 Kind getKind() const override { return CE_CXXMemberOperator; } 686 687 static bool classof(const CallEvent *CA) { 688 return CA->getKind() == CE_CXXMemberOperator; 689 } 690 }; 691 692 /// \brief Represents an implicit call to a C++ destructor. 693 /// 694 /// This can occur at the end of a scope (for automatic objects), at the end 695 /// of a full-expression (for temporaries), or as part of a delete. 696 class CXXDestructorCall : public CXXInstanceCall { 697 friend class CallEventManager; 698 699 protected: 700 typedef llvm::PointerIntPair<const MemRegion *, 1, bool> DtorDataTy; 701 702 /// Creates an implicit destructor. 703 /// 704 /// \param DD The destructor that will be called. 705 /// \param Trigger The statement whose completion causes this destructor call. 706 /// \param Target The object region to be destructed. 707 /// \param St The path-sensitive state at this point in the program. 708 /// \param LCtx The location context at this point in the program. 709 CXXDestructorCall(const CXXDestructorDecl *DD, const Stmt *Trigger, 710 const MemRegion *Target, bool IsBaseDestructor, 711 ProgramStateRef St, const LocationContext *LCtx) 712 : CXXInstanceCall(DD, St, LCtx) { 713 Data = DtorDataTy(Target, IsBaseDestructor).getOpaqueValue(); 714 Location = Trigger->getLocEnd(); 715 } 716 717 CXXDestructorCall(const CXXDestructorCall &Other) : CXXInstanceCall(Other) {} 718 void cloneTo(void *Dest) const override {new (Dest) CXXDestructorCall(*this);} 719 720 public: 721 SourceRange getSourceRange() const override { return Location; } 722 unsigned getNumArgs() const override { return 0; } 723 724 RuntimeDefinition getRuntimeDefinition() const override; 725 726 /// \brief Returns the value of the implicit 'this' object. 727 SVal getCXXThisVal() const override; 728 729 /// Returns true if this is a call to a base class destructor. 730 bool isBaseDestructor() const { 731 return DtorDataTy::getFromOpaqueValue(Data).getInt(); 732 } 733 734 Kind getKind() const override { return CE_CXXDestructor; } 735 736 static bool classof(const CallEvent *CA) { 737 return CA->getKind() == CE_CXXDestructor; 738 } 739 }; 740 741 /// \brief Represents a call to a C++ constructor. 742 /// 743 /// Example: \c T(1) 744 class CXXConstructorCall : public AnyFunctionCall { 745 friend class CallEventManager; 746 747 protected: 748 /// Creates a constructor call. 749 /// 750 /// \param CE The constructor expression as written in the source. 751 /// \param Target The region where the object should be constructed. If NULL, 752 /// a new symbolic region will be used. 753 /// \param St The path-sensitive state at this point in the program. 754 /// \param LCtx The location context at this point in the program. 755 CXXConstructorCall(const CXXConstructExpr *CE, const MemRegion *Target, 756 ProgramStateRef St, const LocationContext *LCtx) 757 : AnyFunctionCall(CE, St, LCtx) { 758 Data = Target; 759 } 760 761 CXXConstructorCall(const CXXConstructorCall &Other) : AnyFunctionCall(Other){} 762 void cloneTo(void *Dest) const override { new (Dest) CXXConstructorCall(*this); } 763 764 void getExtraInvalidatedValues(ValueList &Values, 765 RegionAndSymbolInvalidationTraits *ETraits) const override; 766 767 public: 768 virtual const CXXConstructExpr *getOriginExpr() const { 769 return cast<CXXConstructExpr>(AnyFunctionCall::getOriginExpr()); 770 } 771 772 const CXXConstructorDecl *getDecl() const override { 773 return getOriginExpr()->getConstructor(); 774 } 775 776 unsigned getNumArgs() const override { return getOriginExpr()->getNumArgs(); } 777 778 const Expr *getArgExpr(unsigned Index) const override { 779 return getOriginExpr()->getArg(Index); 780 } 781 782 /// \brief Returns the value of the implicit 'this' object. 783 SVal getCXXThisVal() const; 784 785 void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, 786 BindingsTy &Bindings) const override; 787 788 Kind getKind() const override { return CE_CXXConstructor; } 789 790 static bool classof(const CallEvent *CA) { 791 return CA->getKind() == CE_CXXConstructor; 792 } 793 }; 794 795 /// \brief Represents the memory allocation call in a C++ new-expression. 796 /// 797 /// This is a call to "operator new". 798 class CXXAllocatorCall : public AnyFunctionCall { 799 friend class CallEventManager; 800 801 protected: 802 CXXAllocatorCall(const CXXNewExpr *E, ProgramStateRef St, 803 const LocationContext *LCtx) 804 : AnyFunctionCall(E, St, LCtx) {} 805 806 CXXAllocatorCall(const CXXAllocatorCall &Other) : AnyFunctionCall(Other) {} 807 void cloneTo(void *Dest) const override { new (Dest) CXXAllocatorCall(*this); } 808 809 public: 810 virtual const CXXNewExpr *getOriginExpr() const { 811 return cast<CXXNewExpr>(AnyFunctionCall::getOriginExpr()); 812 } 813 814 const FunctionDecl *getDecl() const override { 815 return getOriginExpr()->getOperatorNew(); 816 } 817 818 unsigned getNumArgs() const override { 819 return getOriginExpr()->getNumPlacementArgs() + 1; 820 } 821 822 const Expr *getArgExpr(unsigned Index) const override { 823 // The first argument of an allocator call is the size of the allocation. 824 if (Index == 0) 825 return nullptr; 826 return getOriginExpr()->getPlacementArg(Index - 1); 827 } 828 829 Kind getKind() const override { return CE_CXXAllocator; } 830 831 static bool classof(const CallEvent *CE) { 832 return CE->getKind() == CE_CXXAllocator; 833 } 834 }; 835 836 /// \brief Represents the ways an Objective-C message send can occur. 837 // 838 // Note to maintainers: OCM_Message should always be last, since it does not 839 // need to fit in the Data field's low bits. 840 enum ObjCMessageKind { 841 OCM_PropertyAccess, 842 OCM_Subscript, 843 OCM_Message 844 }; 845 846 /// \brief Represents any expression that calls an Objective-C method. 847 /// 848 /// This includes all of the kinds listed in ObjCMessageKind. 849 class ObjCMethodCall : public CallEvent { 850 friend class CallEventManager; 851 852 const PseudoObjectExpr *getContainingPseudoObjectExpr() const; 853 854 protected: 855 ObjCMethodCall(const ObjCMessageExpr *Msg, ProgramStateRef St, 856 const LocationContext *LCtx) 857 : CallEvent(Msg, St, LCtx) { 858 Data = nullptr; 859 } 860 861 ObjCMethodCall(const ObjCMethodCall &Other) : CallEvent(Other) {} 862 void cloneTo(void *Dest) const override { new (Dest) ObjCMethodCall(*this); } 863 864 void getExtraInvalidatedValues(ValueList &Values, 865 RegionAndSymbolInvalidationTraits *ETraits) const override; 866 867 /// Check if the selector may have multiple definitions (may have overrides). 868 virtual bool canBeOverridenInSubclass(ObjCInterfaceDecl *IDecl, 869 Selector Sel) const; 870 871 public: 872 virtual const ObjCMessageExpr *getOriginExpr() const { 873 return cast<ObjCMessageExpr>(CallEvent::getOriginExpr()); 874 } 875 const ObjCMethodDecl *getDecl() const override { 876 return getOriginExpr()->getMethodDecl(); 877 } 878 unsigned getNumArgs() const override { 879 return getOriginExpr()->getNumArgs(); 880 } 881 const Expr *getArgExpr(unsigned Index) const override { 882 return getOriginExpr()->getArg(Index); 883 } 884 885 bool isInstanceMessage() const { 886 return getOriginExpr()->isInstanceMessage(); 887 } 888 ObjCMethodFamily getMethodFamily() const { 889 return getOriginExpr()->getMethodFamily(); 890 } 891 Selector getSelector() const { 892 return getOriginExpr()->getSelector(); 893 } 894 895 SourceRange getSourceRange() const override; 896 897 /// \brief Returns the value of the receiver at the time of this call. 898 SVal getReceiverSVal() const; 899 900 /// \brief Return the value of 'self' if available. 901 SVal getSelfSVal() const; 902 903 /// \brief Get the interface for the receiver. 904 /// 905 /// This works whether this is an instance message or a class message. 906 /// However, it currently just uses the static type of the receiver. 907 const ObjCInterfaceDecl *getReceiverInterface() const { 908 return getOriginExpr()->getReceiverInterface(); 909 } 910 911 /// \brief Checks if the receiver refers to 'self' or 'super'. 912 bool isReceiverSelfOrSuper() const; 913 914 /// Returns how the message was written in the source (property access, 915 /// subscript, or explicit message send). 916 ObjCMessageKind getMessageKind() const; 917 918 /// Returns true if this property access or subscript is a setter (has the 919 /// form of an assignment). 920 bool isSetter() const { 921 switch (getMessageKind()) { 922 case OCM_Message: 923 llvm_unreachable("This is not a pseudo-object access!"); 924 case OCM_PropertyAccess: 925 return getNumArgs() > 0; 926 case OCM_Subscript: 927 return getNumArgs() > 1; 928 } 929 llvm_unreachable("Unknown message kind"); 930 } 931 932 RuntimeDefinition getRuntimeDefinition() const override; 933 934 bool argumentsMayEscape() const override; 935 936 void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, 937 BindingsTy &Bindings) const override; 938 939 ArrayRef<ParmVarDecl*> parameters() const override; 940 941 Kind getKind() const override { return CE_ObjCMessage; } 942 943 static bool classof(const CallEvent *CA) { 944 return CA->getKind() == CE_ObjCMessage; 945 } 946 }; 947 948 949 /// \brief Manages the lifetime of CallEvent objects. 950 /// 951 /// CallEventManager provides a way to create arbitrary CallEvents "on the 952 /// stack" as if they were value objects by keeping a cache of CallEvent-sized 953 /// memory blocks. The CallEvents created by CallEventManager are only valid 954 /// for the lifetime of the OwnedCallEvent that holds them; right now these 955 /// objects cannot be copied and ownership cannot be transferred. 956 class CallEventManager { 957 friend class CallEvent; 958 959 llvm::BumpPtrAllocator &Alloc; 960 SmallVector<void *, 8> Cache; 961 typedef SimpleFunctionCall CallEventTemplateTy; 962 963 void reclaim(const void *Memory) { 964 Cache.push_back(const_cast<void *>(Memory)); 965 } 966 967 /// Returns memory that can be initialized as a CallEvent. 968 void *allocate() { 969 if (Cache.empty()) 970 return Alloc.Allocate<CallEventTemplateTy>(); 971 else 972 return Cache.pop_back_val(); 973 } 974 975 template <typename T, typename Arg> 976 T *create(Arg A, ProgramStateRef St, const LocationContext *LCtx) { 977 static_assert(sizeof(T) == sizeof(CallEventTemplateTy), 978 "CallEvent subclasses are not all the same size"); 979 return new (allocate()) T(A, St, LCtx); 980 } 981 982 template <typename T, typename Arg1, typename Arg2> 983 T *create(Arg1 A1, Arg2 A2, ProgramStateRef St, const LocationContext *LCtx) { 984 static_assert(sizeof(T) == sizeof(CallEventTemplateTy), 985 "CallEvent subclasses are not all the same size"); 986 return new (allocate()) T(A1, A2, St, LCtx); 987 } 988 989 template <typename T, typename Arg1, typename Arg2, typename Arg3> 990 T *create(Arg1 A1, Arg2 A2, Arg3 A3, ProgramStateRef St, 991 const LocationContext *LCtx) { 992 static_assert(sizeof(T) == sizeof(CallEventTemplateTy), 993 "CallEvent subclasses are not all the same size"); 994 return new (allocate()) T(A1, A2, A3, St, LCtx); 995 } 996 997 template <typename T, typename Arg1, typename Arg2, typename Arg3, 998 typename Arg4> 999 T *create(Arg1 A1, Arg2 A2, Arg3 A3, Arg4 A4, ProgramStateRef St, 1000 const LocationContext *LCtx) { 1001 static_assert(sizeof(T) == sizeof(CallEventTemplateTy), 1002 "CallEvent subclasses are not all the same size"); 1003 return new (allocate()) T(A1, A2, A3, A4, St, LCtx); 1004 } 1005 1006 public: 1007 CallEventManager(llvm::BumpPtrAllocator &alloc) : Alloc(alloc) {} 1008 1009 1010 CallEventRef<> 1011 getCaller(const StackFrameContext *CalleeCtx, ProgramStateRef State); 1012 1013 1014 CallEventRef<> 1015 getSimpleCall(const CallExpr *E, ProgramStateRef State, 1016 const LocationContext *LCtx); 1017 1018 CallEventRef<ObjCMethodCall> 1019 getObjCMethodCall(const ObjCMessageExpr *E, ProgramStateRef State, 1020 const LocationContext *LCtx) { 1021 return create<ObjCMethodCall>(E, State, LCtx); 1022 } 1023 1024 CallEventRef<CXXConstructorCall> 1025 getCXXConstructorCall(const CXXConstructExpr *E, const MemRegion *Target, 1026 ProgramStateRef State, const LocationContext *LCtx) { 1027 return create<CXXConstructorCall>(E, Target, State, LCtx); 1028 } 1029 1030 CallEventRef<CXXDestructorCall> 1031 getCXXDestructorCall(const CXXDestructorDecl *DD, const Stmt *Trigger, 1032 const MemRegion *Target, bool IsBase, 1033 ProgramStateRef State, const LocationContext *LCtx) { 1034 return create<CXXDestructorCall>(DD, Trigger, Target, IsBase, State, LCtx); 1035 } 1036 1037 CallEventRef<CXXAllocatorCall> 1038 getCXXAllocatorCall(const CXXNewExpr *E, ProgramStateRef State, 1039 const LocationContext *LCtx) { 1040 return create<CXXAllocatorCall>(E, State, LCtx); 1041 } 1042 }; 1043 1044 1045 template <typename T> 1046 CallEventRef<T> CallEvent::cloneWithState(ProgramStateRef NewState) const { 1047 assert(isa<T>(*this) && "Cloning to unrelated type"); 1048 static_assert(sizeof(T) == sizeof(CallEvent), 1049 "Subclasses may not add fields"); 1050 1051 if (NewState == State) 1052 return cast<T>(this); 1053 1054 CallEventManager &Mgr = State->getStateManager().getCallEventManager(); 1055 T *Copy = static_cast<T *>(Mgr.allocate()); 1056 cloneTo(Copy); 1057 assert(Copy->getKind() == this->getKind() && "Bad copy"); 1058 1059 Copy->State = NewState; 1060 return Copy; 1061 } 1062 1063 inline void CallEvent::Release() const { 1064 assert(RefCount > 0 && "Reference count is already zero."); 1065 --RefCount; 1066 1067 if (RefCount > 0) 1068 return; 1069 1070 CallEventManager &Mgr = State->getStateManager().getCallEventManager(); 1071 Mgr.reclaim(this); 1072 1073 this->~CallEvent(); 1074 } 1075 1076 } // end namespace ento 1077 } // end namespace clang 1078 1079 namespace llvm { 1080 // Support isa<>, cast<>, and dyn_cast<> for CallEventRef. 1081 template<class T> struct simplify_type< clang::ento::CallEventRef<T> > { 1082 typedef const T *SimpleType; 1083 1084 static SimpleType 1085 getSimplifiedValue(clang::ento::CallEventRef<T> Val) { 1086 return Val.get(); 1087 } 1088 }; 1089 } 1090 1091 #endif 1092