clang 22.0.0git
CallEvent.h
Go to the documentation of this file.
1//===- CallEvent.h - Wrapper for all function and method calls --*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9/// \file This file defines CallEvent and its subclasses, which represent path-
10/// sensitive instances of different kinds of function and method calls
11/// (C, C++, and Objective-C).
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_CALLEVENT_H
16#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_CALLEVENT_H
17
18#include "clang/AST/Decl.h"
19#include "clang/AST/DeclBase.h"
20#include "clang/AST/DeclCXX.h"
21#include "clang/AST/DeclObjC.h"
22#include "clang/AST/Expr.h"
23#include "clang/AST/ExprCXX.h"
24#include "clang/AST/ExprObjC.h"
25#include "clang/AST/Stmt.h"
26#include "clang/AST/Type.h"
28#include "clang/Basic/LLVM.h"
35#include "llvm/ADT/ArrayRef.h"
36#include "llvm/ADT/IntrusiveRefCntPtr.h"
37#include "llvm/ADT/PointerIntPair.h"
38#include "llvm/ADT/PointerUnion.h"
39#include "llvm/ADT/STLExtras.h"
40#include "llvm/ADT/SmallVector.h"
41#include "llvm/ADT/StringRef.h"
42#include "llvm/ADT/iterator_range.h"
43#include "llvm/Support/Allocator.h"
44#include "llvm/Support/Casting.h"
45#include "llvm/Support/ErrorHandling.h"
46#include <cassert>
47#include <limits>
48#include <optional>
49#include <utility>
50
51namespace clang {
52
53class LocationContext;
54class ProgramPoint;
55class ProgramPointTag;
56class StackFrameContext;
57
58namespace ento {
59
78};
79
80class CallEvent;
81
82template <typename T = CallEvent>
83class CallEventRef : public IntrusiveRefCntPtr<const T> {
84public:
86 CallEventRef(const CallEventRef &Orig) : IntrusiveRefCntPtr<const T>(Orig) {}
87
88 // The copy assignment operator is defined as deleted pending further
89 // motivation.
91
93 return this->get()->template cloneWithState<T>(State);
94 }
95
96 // Allow implicit conversions to a superclass type, since CallEventRef
97 // behaves like a pointer-to-const.
98 template <typename SuperT> operator CallEventRef<SuperT>() const {
99 return this->get();
100 }
101};
102
103/// \class RuntimeDefinition
104/// Defines the runtime definition of the called function.
105///
106/// Encapsulates the information we have about which Decl will be used
107/// when the call is executed on the given path. When dealing with dynamic
108/// dispatch, the information is based on DynamicTypeInfo and might not be
109/// precise.
111 /// The Declaration of the function which could be called at runtime.
112 /// NULL if not available.
113 const Decl *D = nullptr;
114
115 /// The region representing an object (ObjC/C++) on which the method is
116 /// called. With dynamic dispatch, the method definition depends on the
117 /// runtime type of this object. NULL when the DynamicTypeInfo is
118 /// precise.
119 const MemRegion *R = nullptr;
120
121 /// A definition is foreign if it has been imported and newly created by the
122 /// ASTImporter. This can be true only if CTU is enabled.
123 const bool Foreign = false;
124
125public:
126 RuntimeDefinition() = default;
127 RuntimeDefinition(const Decl *InD) : D(InD) {}
128 RuntimeDefinition(const Decl *InD, bool Foreign) : D(InD), Foreign(Foreign) {}
129 RuntimeDefinition(const Decl *InD, const MemRegion *InR) : D(InD), R(InR) {}
130
131 const Decl *getDecl() { return D; }
132 bool isForeign() const { return Foreign; }
133
134 /// Check if the definition we have is precise.
135 /// If not, it is possible that the call dispatches to another definition at
136 /// execution time.
137 bool mayHaveOtherDefinitions() { return R != nullptr; }
138
139 /// When other definitions are possible, returns the region whose runtime type
140 /// determines the method definition.
141 const MemRegion *getDispatchRegion() { return R; }
142};
143
144/// Represents an abstract call to a function or method along a
145/// particular path.
146///
147/// CallEvents are created through the factory methods of CallEventManager.
148///
149/// CallEvents should always be cheap to create and destroy. In order for
150/// CallEventManager to be able to re-use CallEvent-sized memory blocks,
151/// subclasses of CallEvent may not add any data members to the base class.
152/// Use the "Data" and "Location" fields instead.
154public:
156
157private:
158 ProgramStateRef State;
159 const LocationContext *LCtx;
160 llvm::PointerUnion<const Expr *, const Decl *> Origin;
161 CFGBlock::ConstCFGElementRef ElemRef = {nullptr, 0};
162 mutable std::optional<bool> Foreign; // Set by CTU analysis.
163
164protected:
165 // This is user data for subclasses.
166 const void *Data;
167
168 // This is user data for subclasses.
169 // This should come right before RefCount, so that the two fields can be
170 // packed together on LP64 platforms.
172
173private:
174 template <typename T> friend struct llvm::IntrusiveRefCntPtrInfo;
175
176 mutable unsigned RefCount = 0;
177
178 void Retain() const { ++RefCount; }
179 void Release() const;
180
181protected:
182 friend class CallEventManager;
183
184 CallEvent(const Expr *E, ProgramStateRef state, const LocationContext *lctx,
186 : State(std::move(state)), LCtx(lctx), Origin(E), ElemRef(ElemRef) {}
187
188 CallEvent(const Decl *D, ProgramStateRef state, const LocationContext *lctx,
190 : State(std::move(state)), LCtx(lctx), Origin(D), ElemRef(ElemRef) {}
191
192 // DO NOT MAKE PUBLIC
193 CallEvent(const CallEvent &Original)
194 : State(Original.State), LCtx(Original.LCtx), Origin(Original.Origin),
195 ElemRef(Original.ElemRef), Data(Original.Data),
196 Location(Original.Location) {}
197
198 /// Copies this CallEvent, with vtable intact, into a new block of memory.
199 virtual void cloneTo(void *Dest) const = 0;
200
201 /// Get the value of arbitrary expressions at this point in the path.
202 SVal getSVal(const Stmt *S) const {
203 return getState()->getSVal(S, getLocationContext());
204 }
205
207
208 /// Used to specify non-argument regions that will be invalidated as a
209 /// result of this call.
210 virtual void
212 RegionAndSymbolInvalidationTraits *ETraits) const {}
213
214public:
215 CallEvent &operator=(const CallEvent &) = delete;
216 virtual ~CallEvent() = default;
217
218 /// Returns the kind of call this is.
219 virtual Kind getKind() const = 0;
220 virtual StringRef getKindAsString() const = 0;
221
222 /// Returns the declaration of the function or method that will be
223 /// called. May be null.
224 virtual const Decl *getDecl() const {
225 return Origin.dyn_cast<const Decl *>();
226 }
227
228 bool isForeign() const {
229 assert(Foreign && "Foreign must be set before querying");
230 return *Foreign;
231 }
232 void setForeign(bool B) const { Foreign = B; }
233
234 /// The state in which the call is being evaluated.
235 const ProgramStateRef &getState() const { return State; }
236
237 /// The context in which the call is being evaluated.
238 const LocationContext *getLocationContext() const { return LCtx; }
239
241 return ElemRef;
242 }
243
244 /// Returns the definition of the function or method that will be
245 /// called.
247
248 /// Returns the expression whose value will be the result of this call.
249 /// May be null.
250 virtual const Expr *getOriginExpr() const {
251 return Origin.dyn_cast<const Expr *>();
252 }
253
254 /// Returns the number of arguments (explicit and implicit).
255 ///
256 /// Note that this may be greater than the number of parameters in the
257 /// callee's declaration, and that it may include arguments not written in
258 /// the source.
259 virtual unsigned getNumArgs() const = 0;
260
261 /// Returns true if the callee is known to be from a system header.
262 bool isInSystemHeader() const {
263 const Decl *D = getDecl();
264 if (!D)
265 return false;
266
267 SourceLocation Loc = D->getLocation();
268 if (Loc.isValid()) {
269 const SourceManager &SM =
270 getState()->getStateManager().getContext().getSourceManager();
271 return SM.isInSystemHeader(D->getLocation());
272 }
273
274 // Special case for implicitly-declared global operator new/delete.
275 // These should be considered system functions.
276 if (const auto *FD = dyn_cast<FunctionDecl>(D))
277 return FD->isOverloadedOperator() && FD->isImplicit() && FD->isGlobal();
278
279 return false;
280 }
281
282 /// Returns a source range for the entire call, suitable for
283 /// outputting in diagnostics.
284 virtual SourceRange getSourceRange() const {
285 return getOriginExpr()->getSourceRange();
286 }
287
288 /// Returns the value of a given argument at the time of the call.
289 virtual SVal getArgSVal(unsigned Index) const;
290
291 /// Returns the expression associated with a given argument.
292 /// May be null if this expression does not appear in the source.
293 virtual const Expr *getArgExpr(unsigned Index) const { return nullptr; }
294
295 /// Returns the source range for errors associated with this argument.
296 ///
297 /// May be invalid if the argument is not written in the source.
298 virtual SourceRange getArgSourceRange(unsigned Index) const;
299
300 /// Returns the result type, adjusted for references.
301 QualType getResultType() const;
302
303 /// Returns the return value of the call.
304 ///
305 /// This should only be called if the CallEvent was created using a state in
306 /// which the return value has already been bound to the origin expression.
307 SVal getReturnValue() const;
308
309 /// Returns true if the type of any of the non-null arguments satisfies
310 /// the condition.
312
313 /// Returns true if any of the arguments appear to represent callbacks.
314 bool hasNonZeroCallbackArg() const;
315
316 /// Returns true if any of the arguments is void*.
317 bool hasVoidPointerToNonConstArg() const;
318
319 /// Returns true if any of the arguments are known to escape to long-
320 /// term storage, even if this method will not modify them.
321 // NOTE: The exact semantics of this are still being defined!
322 // We don't really want a list of hardcoded exceptions in the long run,
323 // but we don't want duplicated lists of known APIs in the short term either.
324 virtual bool argumentsMayEscape() const { return hasNonZeroCallbackArg(); }
325
326 /// Returns true if the callee is an externally-visible function in the
327 /// top-level namespace, such as \c malloc.
328 ///
329 /// You can use this call to determine that a particular function really is
330 /// a library function and not, say, a C++ member function with the same name.
331 ///
332 /// If a name is provided, the function must additionally match the given
333 /// name.
334 ///
335 /// Note that this deliberately excludes C++ library functions in the \c std
336 /// namespace, but will include C library functions accessed through the
337 /// \c std namespace. This also does not check if the function is declared
338 /// as 'extern "C"', or if it uses C++ name mangling.
339 // FIXME: Add a helper for checking namespaces.
340 // FIXME: Move this down to AnyFunctionCall once checkers have more
341 // precise callbacks.
342 bool isGlobalCFunction(StringRef SpecificName = StringRef()) const;
343
344 /// Returns the name of the callee, if its name is a simple identifier.
345 ///
346 /// Note that this will fail for Objective-C methods, blocks, and C++
347 /// overloaded operators. The former is named by a Selector rather than a
348 /// simple identifier, and the latter two do not have names.
349 // FIXME: Move this down to AnyFunctionCall once checkers have more
350 // precise callbacks.
352 const auto *ND = dyn_cast_or_null<NamedDecl>(getDecl());
353 if (!ND)
354 return nullptr;
355 return ND->getIdentifier();
356 }
357
358 /// Returns an appropriate ProgramPoint for this call.
359 ProgramPoint getProgramPoint(bool IsPreVisit = false,
360 const ProgramPointTag *Tag = nullptr) const;
361
362 /// Returns a new state with all argument regions invalidated.
363 ///
364 /// This accepts an alternate state in case some processing has already
365 /// occurred.
366 ProgramStateRef invalidateRegions(unsigned BlockCount,
367 ProgramStateRef Orig = nullptr) const;
368
369 using FrameBindingTy = std::pair<SVal, SVal>;
371
372 /// Populates the given SmallVector with the bindings in the callee's stack
373 /// frame at the start of this call.
374 virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
375 BindingsTy &Bindings) const = 0;
376
377 /// Returns a copy of this CallEvent, but using the given state.
378 template <typename T>
380
381 /// Returns a copy of this CallEvent, but using the given state.
383 return cloneWithState<CallEvent>(NewState);
384 }
385
386 /// Returns true if this is a statement is a function or method call
387 /// of some kind.
388 static bool isCallStmt(const Stmt *S);
389
390 /// Returns the result type of a function or method declaration.
391 ///
392 /// This will return a null QualType if the result type cannot be determined.
393 static QualType getDeclaredResultType(const Decl *D);
394
395 /// Returns true if the given decl is known to be variadic.
396 ///
397 /// \p D must not be null.
398 static bool isVariadic(const Decl *D);
399
400 /// Returns AnalysisDeclContext for the callee stack frame.
401 /// Currently may fail; returns null on failure.
403
404 /// Returns the callee stack frame. That stack frame will only be entered
405 /// during analysis if the call is inlined, but it may still be useful
406 /// in intermediate calculations even if the call isn't inlined.
407 /// May fail; returns null on failure.
408 const StackFrameContext *getCalleeStackFrame(unsigned BlockCount) const;
409
410 /// Returns memory location for a parameter variable within the callee stack
411 /// frame. The behavior is undefined if the block count is different from the
412 /// one that is there when call happens. May fail; returns null on failure.
413 const ParamVarRegion *getParameterLocation(unsigned Index,
414 unsigned BlockCount) const;
415
416 /// Returns true if on the current path, the argument was constructed by
417 /// calling a C++ constructor over it. This is an internal detail of the
418 /// analysis which doesn't necessarily represent the program semantics:
419 /// if we are supposed to construct an argument directly, we may still
420 /// not do that because we don't know how (i.e., construction context is
421 /// unavailable in the CFG or not supported by the analyzer).
422 bool isArgumentConstructedDirectly(unsigned Index) const {
423 // This assumes that the object was not yet removed from the state.
426 .has_value();
427 }
428
429 /// Some calls have parameter numbering mismatched from argument numbering.
430 /// This function converts an argument index to the corresponding
431 /// parameter index. Returns std::nullopt is the argument doesn't correspond
432 /// to any parameter variable.
433 virtual std::optional<unsigned>
434 getAdjustedParameterIndex(unsigned ASTArgumentIndex) const {
435 return ASTArgumentIndex;
436 }
437
438 /// Some call event sub-classes conveniently adjust mismatching AST indices
439 /// to match parameter indices. This function converts an argument index
440 /// as understood by CallEvent to the argument index as understood by the AST.
441 virtual unsigned getASTArgumentIndex(unsigned CallArgumentIndex) const {
442 return CallArgumentIndex;
443 }
444
445 /// Returns the construction context of the call, if it is a C++ constructor
446 /// call or a call of a function returning a C++ class instance. Otherwise
447 /// return nullptr.
449
450 /// If the call returns a C++ record type then the region of its return value
451 /// can be retrieved from its construction context.
452 std::optional<SVal> getReturnValueUnderConstruction() const;
453
454 // Returns the CallEvent representing the caller of this function
455 const CallEventRef<> getCaller() const;
456
457 // Returns true if the function was called from a standard library function.
458 // If not or could not get the caller (it may be a top level function)
459 // returns false.
460 bool isCalledFromSystemHeader() const;
461
462 // Iterator access to formal parameters and their types.
463private:
464 struct GetTypeFn {
465 QualType operator()(ParmVarDecl *PD) const { return PD->getType(); }
466 };
467
468public:
469 /// Return call's formal parameters.
470 ///
471 /// Remember that the number of formal parameters may not match the number
472 /// of arguments for all calls. However, the first parameter will always
473 /// correspond with the argument value returned by \c getArgSVal(0).
475
477 llvm::mapped_iterator<ArrayRef<ParmVarDecl *>::iterator, GetTypeFn>;
478
479 /// Returns an iterator over the types of the call's formal parameters.
480 ///
481 /// This uses the callee decl found by default name lookup rather than the
482 /// definition because it represents a public interface, and probably has
483 /// more annotations.
485 return llvm::map_iterator(parameters().begin(), GetTypeFn());
486 }
487 /// \sa param_type_begin()
489 return llvm::map_iterator(parameters().end(), GetTypeFn());
490 }
491
492 // For debugging purposes only
493 void dump(raw_ostream &Out) const;
494 void dump() const;
495};
496
497/// Represents a call to any sort of function that might have a
498/// FunctionDecl.
500protected:
502 const LocationContext *LCtx,
504 : CallEvent(E, St, LCtx, ElemRef) {}
506 const LocationContext *LCtx,
508 : CallEvent(D, St, LCtx, ElemRef) {}
510
511public:
512 // This function is overridden by subclasses, but they must return
513 // a FunctionDecl.
514 const FunctionDecl *getDecl() const override {
515 return cast<FunctionDecl>(CallEvent::getDecl());
516 }
517
519
520 bool argumentsMayEscape() const override;
521
523 BindingsTy &Bindings) const override;
524
525 ArrayRef<ParmVarDecl *> parameters() const override;
526
527 static bool classof(const CallEvent *CA) {
528 return CA->getKind() >= CE_BEG_FUNCTION_CALLS &&
530 }
531};
532
533/// Represents a C function or static C++ member function call.
534///
535/// Example: \c fun()
537 friend class CallEventManager;
538
539protected:
541 const LocationContext *LCtx,
543 : AnyFunctionCall(CE, St, LCtx, ElemRef) {}
545
546 void cloneTo(void *Dest) const override {
547 new (Dest) SimpleFunctionCall(*this);
548 }
549
550public:
551 const CallExpr *getOriginExpr() const override {
552 return cast<CallExpr>(AnyFunctionCall::getOriginExpr());
553 }
554
555 const FunctionDecl *getDecl() const override;
556
558
559 unsigned getNumArgs() const override { return getOriginExpr()->getNumArgs(); }
560
561 const Expr *getArgExpr(unsigned Index) const override {
562 return getOriginExpr()->getArg(Index);
563 }
564
565 Kind getKind() const override { return CE_Function; }
566 StringRef getKindAsString() const override { return "SimpleFunctionCall"; }
567
568 static bool classof(const CallEvent *CA) {
569 return CA->getKind() == CE_Function;
570 }
571};
572
573/// Represents a call to a block.
574///
575/// Example: <tt>^{ statement-body }()</tt>
576class BlockCall : public CallEvent {
577 friend class CallEventManager;
578
579protected:
582 : CallEvent(CE, St, LCtx, ElemRef) {}
583 BlockCall(const BlockCall &Other) = default;
584
585 void cloneTo(void *Dest) const override { new (Dest) BlockCall(*this); }
586
588 ValueList &Values,
589 RegionAndSymbolInvalidationTraits *ETraits) const override;
590
591public:
592 const CallExpr *getOriginExpr() const override {
593 return cast<CallExpr>(CallEvent::getOriginExpr());
594 }
595
596 unsigned getNumArgs() const override { return getOriginExpr()->getNumArgs(); }
597
598 const Expr *getArgExpr(unsigned Index) const override {
599 return getOriginExpr()->getArg(Index);
600 }
601
602 /// Returns the region associated with this instance of the block.
603 ///
604 /// This may be NULL if the block's origin is unknown.
605 const BlockDataRegion *getBlockRegion() const;
606
607 const BlockDecl *getDecl() const override {
608 const BlockDataRegion *BR = getBlockRegion();
609 if (!BR)
610 return nullptr;
611 return BR->getDecl();
612 }
613
615 const BlockDecl *BD = getDecl();
616 if (!BD)
617 return false;
618
619 return BD->isConversionFromLambda();
620 }
621
622 /// For a block converted from a C++ lambda, returns the block
623 /// VarRegion for the variable holding the captured C++ lambda record.
625 assert(isConversionFromLambda());
626 const BlockDataRegion *BR = getBlockRegion();
627 assert(BR && "Block converted from lambda must have a block region");
628
629 auto ReferencedVars = BR->referenced_vars();
630 assert(!ReferencedVars.empty());
631 return ReferencedVars.begin().getCapturedRegion();
632 }
633
636 return RuntimeDefinition(getDecl());
637
638 // Clang converts lambdas to blocks with an implicit user-defined
639 // conversion operator method on the lambda record that looks (roughly)
640 // like:
641 //
642 // typedef R(^block_type)(P1, P2, ...);
643 // operator block_type() const {
644 // auto Lambda = *this;
645 // return ^(P1 p1, P2 p2, ...){
646 // /* return Lambda(p1, p2, ...); */
647 // };
648 // }
649 //
650 // Here R is the return type of the lambda and P1, P2, ... are
651 // its parameter types. 'Lambda' is a fake VarDecl captured by the block
652 // that is initialized to a copy of the lambda.
653 //
654 // Sema leaves the body of a lambda-converted block empty (it is
655 // produced by CodeGen), so we can't analyze it directly. Instead, we skip
656 // the block body and analyze the operator() method on the captured lambda.
657 const VarDecl *LambdaVD = getRegionStoringCapturedLambda()->getDecl();
658 const CXXRecordDecl *LambdaDecl = LambdaVD->getType()->getAsCXXRecordDecl();
659 CXXMethodDecl *LambdaCallOperator = LambdaDecl->getLambdaCallOperator();
660
661 return RuntimeDefinition(LambdaCallOperator);
662 }
663
664 bool argumentsMayEscape() const override { return true; }
665
667 BindingsTy &Bindings) const override;
668
669 ArrayRef<ParmVarDecl *> parameters() const override;
670
671 Kind getKind() const override { return CE_Block; }
672 StringRef getKindAsString() const override { return "BlockCall"; }
673
674 static bool classof(const CallEvent *CA) { return CA->getKind() == CE_Block; }
675};
676
677/// Represents a non-static C++ member function call, no matter how
678/// it is written.
680protected:
682 const LocationContext *LCtx,
684 : AnyFunctionCall(CE, St, LCtx, ElemRef) {}
686 const LocationContext *LCtx,
688 : AnyFunctionCall(D, St, LCtx, ElemRef) {}
690
692 ValueList &Values,
693 RegionAndSymbolInvalidationTraits *ETraits) const override;
694
695 /// Returns the decl refered to by the "dynamic type" of the current object
696 /// and if the class can be a sub-class or not.
697 /// If the Pointer is null, the flag has no meaning.
698 std::pair<const CXXRecordDecl *, bool> getDeclForDynamicType() const;
699
700public:
701 /// Returns the expression representing the implicit 'this' object.
702 virtual const Expr *getCXXThisExpr() const { return nullptr; }
703
704 /// Returns the value of the implicit 'this' object.
705 virtual SVal getCXXThisVal() const;
706
707 const FunctionDecl *getDecl() const override;
708
710
712 BindingsTy &Bindings) const override;
713
714 static bool classof(const CallEvent *CA) {
715 return CA->getKind() >= CE_BEG_CXX_INSTANCE_CALLS &&
717 }
718};
719
720/// Represents a static C++ operator call.
721///
722/// "A" in this example.
723/// However, "B" and "C" are represented by SimpleFunctionCall.
724/// \code
725/// struct S {
726/// int pad;
727/// static void operator()(int x, int y);
728/// };
729/// S s{10};
730/// void (*fptr)(int, int) = &S::operator();
731///
732/// s(1, 2); // A
733/// S::operator()(1, 2); // B
734/// fptr(1, 2); // C
735/// \endcode
737 friend class CallEventManager;
738
739protected:
741 const LocationContext *LCtx,
743 : SimpleFunctionCall(CE, St, LCtx, ElemRef) {}
745
746 void cloneTo(void *Dest) const override {
747 new (Dest) CXXStaticOperatorCall(*this);
748 }
749
750public:
751 const CXXOperatorCallExpr *getOriginExpr() const override {
752 return cast<CXXOperatorCallExpr>(SimpleFunctionCall::getOriginExpr());
753 }
754
755 unsigned getNumArgs() const override {
756 // Ignore the object parameter that is not used for static member functions.
757 assert(getOriginExpr()->getNumArgs() > 0);
758 return getOriginExpr()->getNumArgs() - 1;
759 }
760
761 const Expr *getArgExpr(unsigned Index) const override {
762 // Ignore the object parameter that is not used for static member functions.
763 return getOriginExpr()->getArg(Index + 1);
764 }
765
766 std::optional<unsigned>
767 getAdjustedParameterIndex(unsigned ASTArgumentIndex) const override {
768 // Ignore the object parameter that is not used for static member functions.
769 if (ASTArgumentIndex == 0)
770 return std::nullopt;
771 return ASTArgumentIndex - 1;
772 }
773
774 unsigned getASTArgumentIndex(unsigned CallArgumentIndex) const override {
775 // Account for the object parameter for the static member function.
776 return CallArgumentIndex + 1;
777 }
778
780 return getOriginExpr()->getOperator();
781 }
782
783 Kind getKind() const override { return CE_CXXStaticOperator; }
784 StringRef getKindAsString() const override { return "CXXStaticOperatorCall"; }
785
786 static bool classof(const CallEvent *CA) {
787 return CA->getKind() == CE_CXXStaticOperator;
788 }
789};
790
791/// Represents a non-static C++ member function call.
792///
793/// Example: \c obj.fun()
795 friend class CallEventManager;
796
797protected:
799 const LocationContext *LCtx,
801 : CXXInstanceCall(CE, St, LCtx, ElemRef) {}
803
804 void cloneTo(void *Dest) const override { new (Dest) CXXMemberCall(*this); }
805
806public:
807 const CXXMemberCallExpr *getOriginExpr() const override {
808 return cast<CXXMemberCallExpr>(CXXInstanceCall::getOriginExpr());
809 }
810
811 unsigned getNumArgs() const override {
812 if (const CallExpr *CE = getOriginExpr())
813 return CE->getNumArgs();
814 return 0;
815 }
816
817 const Expr *getArgExpr(unsigned Index) const override {
818 return getOriginExpr()->getArg(Index);
819 }
820
821 const Expr *getCXXThisExpr() const override;
822
824
825 Kind getKind() const override { return CE_CXXMember; }
826 StringRef getKindAsString() const override { return "CXXMemberCall"; }
827
828 static bool classof(const CallEvent *CA) {
829 return CA->getKind() == CE_CXXMember;
830 }
831};
832
833/// Represents a C++ overloaded operator call where the operator is
834/// implemented as a non-static member function.
835///
836/// Example: <tt>iter + 1</tt>
838 friend class CallEventManager;
839
840protected:
842 const LocationContext *LCtx,
844 : CXXInstanceCall(CE, St, LCtx, ElemRef) {}
846
847 void cloneTo(void *Dest) const override {
848 new (Dest) CXXMemberOperatorCall(*this);
849 }
850
851public:
852 const CXXOperatorCallExpr *getOriginExpr() const override {
853 return cast<CXXOperatorCallExpr>(CXXInstanceCall::getOriginExpr());
854 }
855
856 unsigned getNumArgs() const override {
857 return getOriginExpr()->getNumArgs() - 1;
858 }
859
860 const Expr *getArgExpr(unsigned Index) const override {
861 return getOriginExpr()->getArg(Index + 1);
862 }
863
864 const Expr *getCXXThisExpr() const override;
865
866 Kind getKind() const override { return CE_CXXMemberOperator; }
867 StringRef getKindAsString() const override { return "CXXMemberOperatorCall"; }
868
869 static bool classof(const CallEvent *CA) {
870 return CA->getKind() == CE_CXXMemberOperator;
871 }
872
873 std::optional<unsigned>
874 getAdjustedParameterIndex(unsigned ASTArgumentIndex) const override {
875 // For member operator calls argument 0 on the expression corresponds
876 // to implicit this-parameter on the declaration.
877 return (ASTArgumentIndex > 0)
878 ? std::optional<unsigned>(ASTArgumentIndex - 1)
879 : std::nullopt;
880 }
881
882 unsigned getASTArgumentIndex(unsigned CallArgumentIndex) const override {
883 // For member operator calls argument 0 on the expression corresponds
884 // to implicit this-parameter on the declaration.
885 return CallArgumentIndex + 1;
886 }
887
889 return getOriginExpr()->getOperator();
890 }
891};
892
893/// Represents an implicit call to a C++ destructor.
894///
895/// This can occur at the end of a scope (for automatic objects), at the end
896/// of a full-expression (for temporaries), or as part of a delete.
898 friend class CallEventManager;
899
900protected:
901 using DtorDataTy = llvm::PointerIntPair<const MemRegion *, 1, bool>;
902
903 /// Creates an implicit destructor.
904 ///
905 /// \param DD The destructor that will be called.
906 /// \param Trigger The statement whose completion causes this destructor call.
907 /// \param Target The object region to be destructed.
908 /// \param St The path-sensitive state at this point in the program.
909 /// \param LCtx The location context at this point in the program.
910 /// \param ElemRef The reference to this destructor in the CFG.
911 ///
912 /// FIXME: Eventually we want to drop \param Target and deduce it from
913 /// \param ElemRef. To do that we need to migrate the logic for target
914 /// region lookup from ExprEngine::ProcessImplicitDtor() and make it
915 /// independent from ExprEngine.
916 CXXDestructorCall(const CXXDestructorDecl *DD, const Stmt *Trigger,
917 const MemRegion *Target, bool IsBaseDestructor,
918 ProgramStateRef St, const LocationContext *LCtx,
920 : CXXInstanceCall(DD, St, LCtx, ElemRef) {
921 Data = DtorDataTy(Target, IsBaseDestructor).getOpaqueValue();
922 Location = Trigger->getEndLoc();
923 }
924
926
927 void cloneTo(void *Dest) const override {
928 new (Dest) CXXDestructorCall(*this);
929 }
930
931public:
932 SourceRange getSourceRange() const override { return Location; }
933 unsigned getNumArgs() const override { return 0; }
934
936
937 /// Returns the value of the implicit 'this' object.
938 SVal getCXXThisVal() const override;
939
940 /// Returns true if this is a call to a base class destructor.
941 bool isBaseDestructor() const {
942 return DtorDataTy::getFromOpaqueValue(Data).getInt();
943 }
944
945 Kind getKind() const override { return CE_CXXDestructor; }
946 StringRef getKindAsString() const override { return "CXXDestructorCall"; }
947
948 static bool classof(const CallEvent *CA) {
949 return CA->getKind() == CE_CXXDestructor;
950 }
951};
952
953/// Represents any constructor invocation. This includes regular constructors
954/// and inherited constructors.
956protected:
958 ProgramStateRef St, const LocationContext *LCtx,
960 : AnyFunctionCall(E, St, LCtx, ElemRef) {
961 assert(E && (isa<CXXConstructExpr>(E) || isa<CXXInheritedCtorInitExpr>(E)));
962 // Target may be null when the region is unknown.
963 Data = Target;
964 }
965
967 ValueList &Values,
968 RegionAndSymbolInvalidationTraits *ETraits) const override;
969
971 BindingsTy &Bindings) const override;
972
973public:
974 /// Returns the value of the implicit 'this' object.
975 SVal getCXXThisVal() const;
976
977 static bool classof(const CallEvent *Call) {
978 return Call->getKind() >= CE_BEG_CXX_CONSTRUCTOR_CALLS &&
980 }
981};
982
983/// Represents a call to a C++ constructor.
984///
985/// Example: \c T(1)
987 friend class CallEventManager;
988
989protected:
990 /// Creates a constructor call.
991 ///
992 /// \param CE The constructor expression as written in the source.
993 /// \param Target The region where the object should be constructed. If NULL,
994 /// a new symbolic region will be used.
995 /// \param St The path-sensitive state at this point in the program.
996 /// \param LCtx The location context at this point in the program.
997 /// \param ElemRef The reference to this constructor in the CFG.
998 ///
999 /// FIXME: Eventually we want to drop \param Target and deduce it from
1000 /// \param ElemRef.
1002 ProgramStateRef St, const LocationContext *LCtx,
1004 : AnyCXXConstructorCall(CE, Target, St, LCtx, ElemRef) {}
1005
1007
1008 void cloneTo(void *Dest) const override {
1009 new (Dest) CXXConstructorCall(*this);
1010 }
1011
1012public:
1013 const CXXConstructExpr *getOriginExpr() const override {
1014 return cast<CXXConstructExpr>(AnyFunctionCall::getOriginExpr());
1015 }
1016
1017 const CXXConstructorDecl *getDecl() const override {
1018 return getOriginExpr()->getConstructor();
1019 }
1020
1021 unsigned getNumArgs() const override { return getOriginExpr()->getNumArgs(); }
1022
1023 const Expr *getArgExpr(unsigned Index) const override {
1024 return getOriginExpr()->getArg(Index);
1025 }
1026
1027 Kind getKind() const override { return CE_CXXConstructor; }
1028 StringRef getKindAsString() const override { return "CXXConstructorCall"; }
1029
1030 static bool classof(const CallEvent *CA) {
1031 return CA->getKind() == CE_CXXConstructor;
1032 }
1033};
1034
1035/// Represents a call to a C++ inherited constructor.
1036///
1037/// Example: \c class T : public S { using S::S; }; T(1);
1038///
1039// Note, it is difficult to model the parameters. This is one of the reasons
1040// why we skip analysis of inheriting constructors as top-level functions.
1041// CXXInheritedCtorInitExpr doesn't take arguments and doesn't model parameter
1042// initialization because there is none: the arguments in the outer
1043// CXXConstructExpr directly initialize the parameters of the base class
1044// constructor, and no copies are made. (Making a copy of the parameter is
1045// incorrect, at least if it's done in an observable way.) The derived class
1046// constructor doesn't even exist in the formal model.
1047/// E.g., in:
1048///
1049/// struct X { X *p = this; ~X() {} };
1050/// struct A { A(X x) : b(x.p == &x) {} bool b; };
1051/// struct B : A { using A::A; };
1052/// B b = X{};
1053///
1054/// ... b.b is initialized to true.
1056 friend class CallEventManager;
1057
1058protected:
1060 const MemRegion *Target, ProgramStateRef St,
1061 const LocationContext *LCtx,
1063 : AnyCXXConstructorCall(CE, Target, St, LCtx, ElemRef) {}
1064
1066 default;
1067
1068 void cloneTo(void *Dest) const override {
1069 new (Dest) CXXInheritedConstructorCall(*this);
1070 }
1071
1072public:
1073 const CXXInheritedCtorInitExpr *getOriginExpr() const override {
1074 return cast<CXXInheritedCtorInitExpr>(AnyFunctionCall::getOriginExpr());
1075 }
1076
1077 const CXXConstructorDecl *getDecl() const override {
1078 return getOriginExpr()->getConstructor();
1079 }
1080
1081 /// Obtain the stack frame of the inheriting constructor. Argument expressions
1082 /// can be found on the call site of that stack frame.
1084
1085 /// Obtain the CXXConstructExpr for the sub-class that inherited the current
1086 /// constructor (possibly indirectly). It's the statement that contains
1087 /// argument expressions.
1089 return cast<CXXConstructExpr>(getInheritingStackFrame()->getCallSite());
1090 }
1091
1092 unsigned getNumArgs() const override {
1094 }
1095
1096 const Expr *getArgExpr(unsigned Index) const override {
1097 return getInheritingConstructor()->getArg(Index);
1098 }
1099
1100 SVal getArgSVal(unsigned Index) const override {
1101 return getState()->getSVal(
1102 getArgExpr(Index),
1103 getInheritingStackFrame()->getParent()->getStackFrame());
1104 }
1105
1106 Kind getKind() const override { return CE_CXXInheritedConstructor; }
1107 StringRef getKindAsString() const override {
1108 return "CXXInheritedConstructorCall";
1109 }
1110
1111 static bool classof(const CallEvent *CA) {
1112 return CA->getKind() == CE_CXXInheritedConstructor;
1113 }
1114};
1115
1116/// Represents the memory allocation call in a C++ new-expression.
1117///
1118/// This is a call to "operator new".
1120 friend class CallEventManager;
1121
1122protected:
1124 const LocationContext *LCtx,
1126 : AnyFunctionCall(E, St, LCtx, ElemRef) {}
1128
1129 void cloneTo(void *Dest) const override {
1130 new (Dest) CXXAllocatorCall(*this);
1131 }
1132
1133public:
1134 const CXXNewExpr *getOriginExpr() const override {
1135 return cast<CXXNewExpr>(AnyFunctionCall::getOriginExpr());
1136 }
1137
1138 const FunctionDecl *getDecl() const override {
1139 return getOriginExpr()->getOperatorNew();
1140 }
1141
1145 }
1146
1147 /// Number of non-placement arguments to the call. It is equal to 2 for
1148 /// C++17 aligned operator new() calls that have alignment implicitly
1149 /// passed as the second argument, and to 1 for other operator new() calls.
1150 unsigned getNumImplicitArgs() const {
1152 }
1153
1154 unsigned getNumArgs() const override {
1156 }
1157
1158 bool isArray() const { return getOriginExpr()->isArray(); }
1159
1160 std::optional<const clang::Expr *> getArraySizeExpr() const {
1161 return getOriginExpr()->getArraySize();
1162 }
1163
1165 assert(isArray() && "The allocator call doesn't allocate and array!");
1166
1167 return getState()->getSVal(*getArraySizeExpr(), getLocationContext());
1168 }
1169
1170 const Expr *getArgExpr(unsigned Index) const override {
1171 // The first argument of an allocator call is the size of the allocation.
1172 if (Index < getNumImplicitArgs())
1173 return nullptr;
1175 }
1176
1177 /// Number of placement arguments to the operator new() call. For example,
1178 /// standard std::nothrow operator new and standard placement new both have
1179 /// 1 implicit argument (size) and 1 placement argument, while regular
1180 /// operator new() has 1 implicit argument and 0 placement arguments.
1181 const Expr *getPlacementArgExpr(unsigned Index) const {
1182 return getOriginExpr()->getPlacementArg(Index);
1183 }
1184
1185 Kind getKind() const override { return CE_CXXAllocator; }
1186 StringRef getKindAsString() const override { return "CXXAllocatorCall"; }
1187
1188 static bool classof(const CallEvent *CE) {
1189 return CE->getKind() == CE_CXXAllocator;
1190 }
1191};
1192
1193/// Represents the memory deallocation call in a C++ delete-expression.
1194///
1195/// This is a call to "operator delete".
1196// FIXME: CXXDeleteExpr isn't present for custom delete operators, or even for
1197// some those that are in the standard library, like the no-throw or align_val
1198// versions.
1199// Some pointers:
1200// http://lists.llvm.org/pipermail/cfe-dev/2020-April/065080.html
1201// clang/test/Analysis/cxx-dynamic-memory-analysis-order.cpp
1202// clang/unittests/StaticAnalyzer/CallEventTest.cpp
1204 friend class CallEventManager;
1205
1206protected:
1208 const LocationContext *LCtx,
1210 : AnyFunctionCall(E, St, LCtx, ElemRef) {}
1212
1213 void cloneTo(void *Dest) const override {
1214 new (Dest) CXXDeallocatorCall(*this);
1215 }
1216
1217public:
1218 const CXXDeleteExpr *getOriginExpr() const override {
1219 return cast<CXXDeleteExpr>(AnyFunctionCall::getOriginExpr());
1220 }
1221
1222 const FunctionDecl *getDecl() const override {
1223 return getOriginExpr()->getOperatorDelete();
1224 }
1225
1226 unsigned getNumArgs() const override { return getDecl()->getNumParams(); }
1227
1228 const Expr *getArgExpr(unsigned Index) const override {
1229 // CXXDeleteExpr's only have a single argument.
1230 return getOriginExpr()->getArgument();
1231 }
1232
1233 Kind getKind() const override { return CE_CXXDeallocator; }
1234 StringRef getKindAsString() const override { return "CXXDeallocatorCall"; }
1235
1236 static bool classof(const CallEvent *CE) {
1237 return CE->getKind() == CE_CXXDeallocator;
1238 }
1239};
1240
1241/// Represents the ways an Objective-C message send can occur.
1242//
1243// Note to maintainers: OCM_Message should always be last, since it does not
1244// need to fit in the Data field's low bits.
1246
1247/// Represents any expression that calls an Objective-C method.
1248///
1249/// This includes all of the kinds listed in ObjCMessageKind.
1251 friend class CallEventManager;
1252
1253 const PseudoObjectExpr *getContainingPseudoObjectExpr() const;
1254
1255protected:
1257 const LocationContext *LCtx,
1259 : CallEvent(Msg, St, LCtx, ElemRef) {
1260 Data = nullptr;
1261 }
1262
1264
1265 void cloneTo(void *Dest) const override { new (Dest) ObjCMethodCall(*this); }
1266
1268 ValueList &Values,
1269 RegionAndSymbolInvalidationTraits *ETraits) const override;
1270
1271 /// Check if the selector may have multiple definitions (may have overrides).
1272 virtual bool canBeOverridenInSubclass(ObjCInterfaceDecl *IDecl,
1273 Selector Sel) const;
1274
1275public:
1276 const ObjCMessageExpr *getOriginExpr() const override {
1277 return cast<ObjCMessageExpr>(CallEvent::getOriginExpr());
1278 }
1279
1280 const ObjCMethodDecl *getDecl() const override {
1281 return getOriginExpr()->getMethodDecl();
1282 }
1283
1284 unsigned getNumArgs() const override { return getOriginExpr()->getNumArgs(); }
1285
1286 const Expr *getArgExpr(unsigned Index) const override {
1287 return getOriginExpr()->getArg(Index);
1288 }
1289
1290 bool isInstanceMessage() const {
1291 return getOriginExpr()->isInstanceMessage();
1292 }
1293
1295 return getOriginExpr()->getMethodFamily();
1296 }
1297
1299
1300 SourceRange getSourceRange() const override;
1301
1302 /// Returns the value of the receiver at the time of this call.
1303 SVal getReceiverSVal() const;
1304
1305 /// Get the interface for the receiver.
1306 ///
1307 /// This works whether this is an instance message or a class message.
1308 /// However, it currently just uses the static type of the receiver.
1311 }
1312
1313 /// Checks if the receiver refers to 'self' or 'super'.
1314 bool isReceiverSelfOrSuper() const;
1315
1316 /// Returns how the message was written in the source (property access,
1317 /// subscript, or explicit message send).
1319
1320 /// Returns true if this property access or subscript is a setter (has the
1321 /// form of an assignment).
1322 bool isSetter() const {
1323 switch (getMessageKind()) {
1324 case OCM_Message:
1325 llvm_unreachable("This is not a pseudo-object access!");
1326 case OCM_PropertyAccess:
1327 return getNumArgs() > 0;
1328 case OCM_Subscript:
1329 return getNumArgs() > 1;
1330 }
1331 llvm_unreachable("Unknown message kind");
1332 }
1333
1334 // Returns the property accessed by this method, either explicitly via
1335 // property syntax or implicitly via a getter or setter method. Returns
1336 // nullptr if the call is not a prooperty access.
1338
1339 RuntimeDefinition getRuntimeDefinition() const override;
1340
1341 bool argumentsMayEscape() const override;
1342
1343 void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
1344 BindingsTy &Bindings) const override;
1345
1346 ArrayRef<ParmVarDecl *> parameters() const override;
1347
1348 Kind getKind() const override { return CE_ObjCMessage; }
1349 StringRef getKindAsString() const override { return "ObjCMethodCall"; }
1350
1351 static bool classof(const CallEvent *CA) {
1352 return CA->getKind() == CE_ObjCMessage;
1353 }
1354};
1355
1356/// Manages the lifetime of CallEvent objects.
1357///
1358/// CallEventManager provides a way to create arbitrary CallEvents "on the
1359/// stack" as if they were value objects by keeping a cache of CallEvent-sized
1360/// memory blocks. The CallEvents created by CallEventManager are only valid
1361/// for the lifetime of the OwnedCallEvent that holds them; right now these
1362/// objects cannot be copied and ownership cannot be transferred.
1364 friend class CallEvent;
1365
1366 llvm::BumpPtrAllocator &Alloc;
1368
1370
1371 void reclaim(const void *Memory) {
1372 Cache.push_back(const_cast<void *>(Memory));
1373 }
1374
1375 /// Returns memory that can be initialized as a CallEvent.
1376 void *allocate() {
1377 if (Cache.empty())
1378 return Alloc.Allocate<CallEventTemplateTy>();
1379 else
1380 return Cache.pop_back_val();
1381 }
1382
1383 template <typename T, typename Arg>
1384 T *create(Arg A, ProgramStateRef St, const LocationContext *LCtx,
1386 static_assert(sizeof(T) == sizeof(CallEventTemplateTy),
1387 "CallEvent subclasses are not all the same size");
1388 return new (allocate()) T(A, St, LCtx, ElemRef);
1389 }
1390
1391 template <typename T, typename Arg1, typename Arg2>
1392 T *create(Arg1 A1, Arg2 A2, ProgramStateRef St, const LocationContext *LCtx,
1394 static_assert(sizeof(T) == sizeof(CallEventTemplateTy),
1395 "CallEvent subclasses are not all the same size");
1396 return new (allocate()) T(A1, A2, St, LCtx, ElemRef);
1397 }
1398
1399 template <typename T, typename Arg1, typename Arg2, typename Arg3>
1400 T *create(Arg1 A1, Arg2 A2, Arg3 A3, ProgramStateRef St,
1401 const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef) {
1402 static_assert(sizeof(T) == sizeof(CallEventTemplateTy),
1403 "CallEvent subclasses are not all the same size");
1404 return new (allocate()) T(A1, A2, A3, St, LCtx, ElemRef);
1405 }
1406
1407 template <typename T, typename Arg1, typename Arg2, typename Arg3,
1408 typename Arg4>
1409 T *create(Arg1 A1, Arg2 A2, Arg3 A3, Arg4 A4, ProgramStateRef St,
1410 const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef) {
1411 static_assert(sizeof(T) == sizeof(CallEventTemplateTy),
1412 "CallEvent subclasses are not all the same size");
1413 return new (allocate()) T(A1, A2, A3, A4, St, LCtx, ElemRef);
1414 }
1415
1416public:
1417 CallEventManager(llvm::BumpPtrAllocator &alloc) : Alloc(alloc) {}
1418
1419 /// Gets an outside caller given a callee context.
1421 ProgramStateRef State);
1422
1423 /// Gets a call event for a function call, Objective-C method call,
1424 /// a 'new', or a 'delete' call.
1426 const LocationContext *LC,
1428
1430 const LocationContext *LCtx,
1432
1435 const LocationContext *LCtx,
1437 return create<ObjCMethodCall>(E, State, LCtx, ElemRef);
1438 }
1439
1442 ProgramStateRef State, const LocationContext *LCtx,
1444 return create<CXXConstructorCall>(E, Target, State, LCtx, ElemRef);
1445 }
1446
1449 const MemRegion *Target, ProgramStateRef State,
1450 const LocationContext *LCtx,
1452 return create<CXXInheritedConstructorCall>(E, Target, State, LCtx, ElemRef);
1453 }
1454
1457 const MemRegion *Target, bool IsBase,
1458 ProgramStateRef State, const LocationContext *LCtx,
1460 return create<CXXDestructorCall>(DD, Trigger, Target, IsBase, State, LCtx,
1461 ElemRef);
1462 }
1463
1466 const LocationContext *LCtx,
1468 return create<CXXAllocatorCall>(E, State, LCtx, ElemRef);
1469 }
1470
1473 const LocationContext *LCtx,
1475 return create<CXXDeallocatorCall>(E, State, LCtx, ElemRef);
1476 }
1477};
1478
1479template <typename T>
1481 assert(isa<T>(*this) && "Cloning to unrelated type");
1482 static_assert(sizeof(T) == sizeof(CallEvent),
1483 "Subclasses may not add fields");
1484
1485 if (NewState == State)
1486 return cast<T>(this);
1487
1488 CallEventManager &Mgr = State->getStateManager().getCallEventManager();
1489 T *Copy = static_cast<T *>(Mgr.allocate());
1490 cloneTo(Copy);
1491 assert(Copy->getKind() == this->getKind() && "Bad copy");
1492
1493 Copy->State = NewState;
1494 return Copy;
1495}
1496
1497inline void CallEvent::Release() const {
1498 assert(RefCount > 0 && "Reference count is already zero.");
1499 --RefCount;
1500
1501 if (RefCount > 0)
1502 return;
1503
1504 CallEventManager &Mgr = State->getStateManager().getCallEventManager();
1505 Mgr.reclaim(this);
1506
1507 this->~CallEvent();
1508}
1509
1510} // namespace ento
1511
1512} // namespace clang
1513
1514namespace llvm {
1515
1516// Support isa<>, cast<>, and dyn_cast<> for CallEventRef.
1517template <class T> struct simplify_type<clang::ento::CallEventRef<T>> {
1518 using SimpleType = const T *;
1519
1521 return Val.get();
1522 }
1523};
1524
1525} // namespace llvm
1526
1527#endif // LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_CALLEVENT_H
const Decl * D
Expr * E
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
llvm::MachO::Target Target
Definition: MachO.h:51
#define SM(sm)
Definition: OffloadArch.cpp:16
Defines the clang::SourceLocation class and associated facilities.
Defines the SourceManager interface.
TypePropertyCache< Private > Cache
Definition: Type.cpp:4836
C Language Family Type Representation.
AnalysisDeclContext contains the context data for the function, method or block under analysis.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition: Decl.h:4634
bool isConversionFromLambda() const
Definition: Decl.h:4777
ElementRefImpl< true > ConstCFGElementRef
Definition: CFG.h:921
Represents a call to a C++ constructor.
Definition: ExprCXX.h:1549
Expr * getArg(unsigned Arg)
Return the specified argument.
Definition: ExprCXX.h:1692
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
Definition: ExprCXX.h:1612
unsigned getNumArgs() const
Return the number of arguments to the constructor call.
Definition: ExprCXX.h:1689
Represents a C++ constructor within a class.
Definition: DeclCXX.h:2604
Represents a delete expression for memory deallocation and destructor calls, e.g.
Definition: ExprCXX.h:2620
FunctionDecl * getOperatorDelete() const
Definition: ExprCXX.h:2659
Expr * getArgument()
Definition: ExprCXX.h:2661
Represents a C++ destructor within a class.
Definition: DeclCXX.h:2869
Represents a call to an inherited base class constructor from an inheriting constructor.
Definition: ExprCXX.h:1753
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will call.
Definition: ExprCXX.h:1790
Represents a call to a member function that may be written either with member call syntax (e....
Definition: ExprCXX.h:179
Represents a static or instance method of a struct/union/class.
Definition: DeclCXX.h:2129
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
Definition: ExprCXX.h:2349
bool isArray() const
Definition: ExprCXX.h:2458
unsigned getNumImplicitArgs() const
Definition: ExprCXX.h:2505
std::optional< Expr * > getArraySize()
This might return std::nullopt even if isArray() returns true, since there might not be an array size...
Definition: ExprCXX.h:2463
Expr * getPlacementArg(unsigned I)
Definition: ExprCXX.h:2497
unsigned getNumPlacementArgs() const
Definition: ExprCXX.h:2488
FunctionDecl * getOperatorNew() const
Definition: ExprCXX.h:2453
A call to an overloaded operator written using operator syntax.
Definition: ExprCXX.h:84
OverloadedOperatorKind getOperator() const
Returns the kind of overloaded operator that this expression refers to.
Definition: ExprCXX.h:114
Represents a C++ struct/union/class.
Definition: DeclCXX.h:258
CXXMethodDecl * getLambdaCallOperator() const
Retrieve the lambda call operator of the closure type if this is a closure type.
Definition: DeclCXX.cpp:1736
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition: Expr.h:2879
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
Definition: Expr.h:3083
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
Definition: Expr.h:3070
ConstructionContext's subclasses describe different ways of constructing an object in C++.
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
This represents one expression.
Definition: Expr.h:112
Represents a function declaration or definition.
Definition: Decl.h:1999
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
Definition: Decl.cpp:3767
One of these records is kept for each identifier that is lexed.
It wraps the AnalysisDeclContext to represent both the call stack with the help of StackFrameContext ...
Represents an ObjC class declaration.
Definition: DeclObjC.h:1154
An expression that sends a message to the given Objective-C object or class.
Definition: ExprObjC.h:940
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
Definition: ExprObjC.h:1403
ObjCMethodFamily getMethodFamily() const
Definition: ExprObjC.h:1383
Selector getSelector() const
Definition: ExprObjC.cpp:289
bool isInstanceMessage() const
Determine whether this is an instance message to either a computed object or to super.
Definition: ExprObjC.h:1256
ObjCInterfaceDecl * getReceiverInterface() const
Retrieve the Objective-C interface to which this message is being directed, if known.
Definition: ExprObjC.cpp:310
const ObjCMethodDecl * getMethodDecl() const
Definition: ExprObjC.h:1364
unsigned getNumArgs() const
Return the number of actual arguments in this message, not counting the receiver.
Definition: ExprObjC.h:1390
ObjCMethodDecl - Represents an instance or class method declaration.
Definition: DeclObjC.h:140
Represents one property declaration in an Objective-C interface.
Definition: DeclObjC.h:731
Represents a parameter to a function.
Definition: Decl.h:1789
ProgramPoints can be "tagged" as representing points specific to a given analysis entity.
Definition: ProgramPoint.h:38
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
Definition: Expr.h:6692
A (possibly-)qualified type.
Definition: TypeBase.h:937
Smart pointer class that efficiently represents Objective-C method names.
Encodes a location in the source.
This class handles loading and caching of source files into memory.
A trivial tuple used to represent a source range.
It represents a stack frame of the call stack (based on CallEvent).
Stmt - This represents one statement.
Definition: Stmt.h:85
SourceLocation getEndLoc() const LLVM_READONLY
Definition: Stmt.cpp:358
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition: Stmt.cpp:334
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
Definition: Type.h:26
QualType getType() const
Definition: Decl.h:722
Represents a variable declaration or definition.
Definition: Decl.h:925
Represents any constructor invocation.
Definition: CallEvent.h:955
void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, BindingsTy &Bindings) const override
Populates the given SmallVector with the bindings in the callee's stack frame at the start of this ca...
Definition: CallEvent.cpp:958
AnyCXXConstructorCall(const Expr *E, const MemRegion *Target, ProgramStateRef St, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.h:957
void getExtraInvalidatedValues(ValueList &Values, RegionAndSymbolInvalidationTraits *ETraits) const override
Used to specify non-argument regions that will be invalidated as a result of this call.
Definition: CallEvent.cpp:941
SVal getCXXThisVal() const
Returns the value of the implicit 'this' object.
Definition: CallEvent.cpp:935
static bool classof(const CallEvent *Call)
Definition: CallEvent.h:977
Represents a call to any sort of function that might have a FunctionDecl.
Definition: CallEvent.h:499
const FunctionDecl * getDecl() const override
Returns the declaration of the function or method that will be called.
Definition: CallEvent.h:514
AnyFunctionCall(const Expr *E, ProgramStateRef St, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.h:501
ArrayRef< ParmVarDecl * > parameters() const override
Return call's formal parameters.
Definition: CallEvent.cpp:554
void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, BindingsTy &Bindings) const override
Populates the given SmallVector with the bindings in the callee's stack frame at the start of this ca...
Definition: CallEvent.cpp:615
static bool classof(const CallEvent *CA)
Definition: CallEvent.h:527
AnyFunctionCall(const Decl *D, ProgramStateRef St, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.h:505
bool argumentsMayEscape() const override
Returns true if any of the arguments are known to escape to long- term storage, even if this method w...
Definition: CallEvent.cpp:624
AnyFunctionCall(const AnyFunctionCall &Other)=default
RuntimeDefinition getRuntimeDefinition() const override
Returns the definition of the function or method that will be called.
Definition: CallEvent.cpp:561
Represents a call to a block.
Definition: CallEvent.h:576
const BlockDecl * getDecl() const override
Returns the declaration of the function or method that will be called.
Definition: CallEvent.h:607
void cloneTo(void *Dest) const override
Copies this CallEvent, with vtable intact, into a new block of memory.
Definition: CallEvent.h:585
bool argumentsMayEscape() const override
Returns true if any of the arguments are known to escape to long- term storage, even if this method w...
Definition: CallEvent.h:664
unsigned getNumArgs() const override
Returns the number of arguments (explicit and implicit).
Definition: CallEvent.h:596
RuntimeDefinition getRuntimeDefinition() const override
Returns the definition of the function or method that will be called.
Definition: CallEvent.h:634
const BlockDataRegion * getBlockRegion() const
Returns the region associated with this instance of the block.
Definition: CallEvent.cpp:891
bool isConversionFromLambda() const
Definition: CallEvent.h:614
ArrayRef< ParmVarDecl * > parameters() const override
Return call's formal parameters.
Definition: CallEvent.cpp:898
Kind getKind() const override
Returns the kind of call this is.
Definition: CallEvent.h:671
void getExtraInvalidatedValues(ValueList &Values, RegionAndSymbolInvalidationTraits *ETraits) const override
Used to specify non-argument regions that will be invalidated as a result of this call.
Definition: CallEvent.cpp:905
const VarRegion * getRegionStoringCapturedLambda() const
For a block converted from a C++ lambda, returns the block VarRegion for the variable holding the cap...
Definition: CallEvent.h:624
const Expr * getArgExpr(unsigned Index) const override
Returns the expression associated with a given argument.
Definition: CallEvent.h:598
BlockCall(const CallExpr *CE, ProgramStateRef St, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.h:580
BlockCall(const BlockCall &Other)=default
static bool classof(const CallEvent *CA)
Definition: CallEvent.h:674
void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, BindingsTy &Bindings) const override
Populates the given SmallVector with the bindings in the callee's stack frame at the start of this ca...
Definition: CallEvent.cpp:912
StringRef getKindAsString() const override
Definition: CallEvent.h:672
const CallExpr * getOriginExpr() const override
Returns the expression whose value will be the result of this call.
Definition: CallEvent.h:592
BlockDataRegion - A region that represents a block instance.
Definition: MemRegion.h:706
LLVM_ATTRIBUTE_RETURNS_NONNULL const BlockDecl * getDecl() const
Definition: MemRegion.h:736
llvm::iterator_range< referenced_vars_iterator > referenced_vars() const
Definition: MemRegion.cpp:1831
Represents the memory allocation call in a C++ new-expression.
Definition: CallEvent.h:1119
unsigned getNumArgs() const override
Returns the number of arguments (explicit and implicit).
Definition: CallEvent.h:1154
unsigned getNumImplicitArgs() const
Number of non-placement arguments to the call.
Definition: CallEvent.h:1150
const CXXNewExpr * getOriginExpr() const override
Returns the expression whose value will be the result of this call.
Definition: CallEvent.h:1134
Kind getKind() const override
Returns the kind of call this is.
Definition: CallEvent.h:1185
const Expr * getArgExpr(unsigned Index) const override
Returns the expression associated with a given argument.
Definition: CallEvent.h:1170
std::optional< const clang::Expr * > getArraySizeExpr() const
Definition: CallEvent.h:1160
static bool classof(const CallEvent *CE)
Definition: CallEvent.h:1188
const Expr * getPlacementArgExpr(unsigned Index) const
Number of placement arguments to the operator new() call.
Definition: CallEvent.h:1181
CXXAllocatorCall(const CXXAllocatorCall &Other)=default
const FunctionDecl * getDecl() const override
Returns the declaration of the function or method that will be called.
Definition: CallEvent.h:1138
StringRef getKindAsString() const override
Definition: CallEvent.h:1186
SVal getObjectUnderConstruction() const
Definition: CallEvent.h:1142
CXXAllocatorCall(const CXXNewExpr *E, ProgramStateRef St, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.h:1123
void cloneTo(void *Dest) const override
Copies this CallEvent, with vtable intact, into a new block of memory.
Definition: CallEvent.h:1129
Represents a call to a C++ constructor.
Definition: CallEvent.h:986
CXXConstructorCall(const CXXConstructorCall &Other)=default
const CXXConstructorDecl * getDecl() const override
Returns the declaration of the function or method that will be called.
Definition: CallEvent.h:1017
const CXXConstructExpr * getOriginExpr() const override
Returns the expression whose value will be the result of this call.
Definition: CallEvent.h:1013
Kind getKind() const override
Returns the kind of call this is.
Definition: CallEvent.h:1027
void cloneTo(void *Dest) const override
Copies this CallEvent, with vtable intact, into a new block of memory.
Definition: CallEvent.h:1008
const Expr * getArgExpr(unsigned Index) const override
Returns the expression associated with a given argument.
Definition: CallEvent.h:1023
unsigned getNumArgs() const override
Returns the number of arguments (explicit and implicit).
Definition: CallEvent.h:1021
CXXConstructorCall(const CXXConstructExpr *CE, const MemRegion *Target, ProgramStateRef St, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Creates a constructor call.
Definition: CallEvent.h:1001
StringRef getKindAsString() const override
Definition: CallEvent.h:1028
static bool classof(const CallEvent *CA)
Definition: CallEvent.h:1030
Represents the memory deallocation call in a C++ delete-expression.
Definition: CallEvent.h:1203
Kind getKind() const override
Returns the kind of call this is.
Definition: CallEvent.h:1233
const CXXDeleteExpr * getOriginExpr() const override
Returns the expression whose value will be the result of this call.
Definition: CallEvent.h:1218
const Expr * getArgExpr(unsigned Index) const override
Returns the expression associated with a given argument.
Definition: CallEvent.h:1228
unsigned getNumArgs() const override
Returns the number of arguments (explicit and implicit).
Definition: CallEvent.h:1226
CXXDeallocatorCall(const CXXDeallocatorCall &Other)=default
static bool classof(const CallEvent *CE)
Definition: CallEvent.h:1236
StringRef getKindAsString() const override
Definition: CallEvent.h:1234
const FunctionDecl * getDecl() const override
Returns the declaration of the function or method that will be called.
Definition: CallEvent.h:1222
void cloneTo(void *Dest) const override
Copies this CallEvent, with vtable intact, into a new block of memory.
Definition: CallEvent.h:1213
CXXDeallocatorCall(const CXXDeleteExpr *E, ProgramStateRef St, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.h:1207
Represents an implicit call to a C++ destructor.
Definition: CallEvent.h:897
static bool classof(const CallEvent *CA)
Definition: CallEvent.h:948
SVal getCXXThisVal() const override
Returns the value of the implicit 'this' object.
Definition: CallEvent.cpp:980
RuntimeDefinition getRuntimeDefinition() const override
Returns the definition of the function or method that will be called.
Definition: CallEvent.cpp:986
bool isBaseDestructor() const
Returns true if this is a call to a base class destructor.
Definition: CallEvent.h:941
unsigned getNumArgs() const override
Returns the number of arguments (explicit and implicit).
Definition: CallEvent.h:933
llvm::PointerIntPair< const MemRegion *, 1, bool > DtorDataTy
Definition: CallEvent.h:901
CXXDestructorCall(const CXXDestructorCall &Other)=default
SourceRange getSourceRange() const override
Returns a source range for the entire call, suitable for outputting in diagnostics.
Definition: CallEvent.h:932
CXXDestructorCall(const CXXDestructorDecl *DD, const Stmt *Trigger, const MemRegion *Target, bool IsBaseDestructor, ProgramStateRef St, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Creates an implicit destructor.
Definition: CallEvent.h:916
void cloneTo(void *Dest) const override
Copies this CallEvent, with vtable intact, into a new block of memory.
Definition: CallEvent.h:927
StringRef getKindAsString() const override
Definition: CallEvent.h:946
Kind getKind() const override
Returns the kind of call this is.
Definition: CallEvent.h:945
Represents a call to a C++ inherited constructor.
Definition: CallEvent.h:1055
CXXInheritedConstructorCall(const CXXInheritedCtorInitExpr *CE, const MemRegion *Target, ProgramStateRef St, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.h:1059
CXXInheritedConstructorCall(const CXXInheritedConstructorCall &Other)=default
static bool classof(const CallEvent *CA)
Definition: CallEvent.h:1111
const CXXInheritedCtorInitExpr * getOriginExpr() const override
Returns the expression whose value will be the result of this call.
Definition: CallEvent.h:1073
const StackFrameContext * getInheritingStackFrame() const
Obtain the stack frame of the inheriting constructor.
Definition: CallEvent.cpp:973
StringRef getKindAsString() const override
Definition: CallEvent.h:1107
Kind getKind() const override
Returns the kind of call this is.
Definition: CallEvent.h:1106
unsigned getNumArgs() const override
Returns the number of arguments (explicit and implicit).
Definition: CallEvent.h:1092
const Expr * getArgExpr(unsigned Index) const override
Returns the expression associated with a given argument.
Definition: CallEvent.h:1096
const CXXConstructorDecl * getDecl() const override
Returns the declaration of the function or method that will be called.
Definition: CallEvent.h:1077
const CXXConstructExpr * getInheritingConstructor() const
Obtain the CXXConstructExpr for the sub-class that inherited the current constructor (possibly indire...
Definition: CallEvent.h:1088
void cloneTo(void *Dest) const override
Copies this CallEvent, with vtable intact, into a new block of memory.
Definition: CallEvent.h:1068
SVal getArgSVal(unsigned Index) const override
Returns the value of a given argument at the time of the call.
Definition: CallEvent.h:1100
Represents a non-static C++ member function call, no matter how it is written.
Definition: CallEvent.h:679
std::pair< const CXXRecordDecl *, bool > getDeclForDynamicType() const
Returns the decl refered to by the "dynamic type" of the current object and if the class can be a sub...
Definition: CallEvent.cpp:763
CXXInstanceCall(const CXXInstanceCall &Other)=default
CXXInstanceCall(const CallExpr *CE, ProgramStateRef St, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.h:681
CXXInstanceCall(const FunctionDecl *D, ProgramStateRef St, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.h:685
void getExtraInvalidatedValues(ValueList &Values, RegionAndSymbolInvalidationTraits *ETraits) const override
Used to specify non-argument regions that will be invalidated as a result of this call.
Definition: CallEvent.cpp:717
virtual SVal getCXXThisVal() const
Returns the value of the implicit 'this' object.
Definition: CallEvent.cpp:747
static bool classof(const CallEvent *CA)
Definition: CallEvent.h:714
RuntimeDefinition getRuntimeDefinition() const override
Returns the definition of the function or method that will be called.
Definition: CallEvent.cpp:777
virtual const Expr * getCXXThisExpr() const
Returns the expression representing the implicit 'this' object.
Definition: CallEvent.h:702
const FunctionDecl * getDecl() const override
Returns the declaration of the function or method that will be called.
Definition: CallEvent.cpp:705
void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, BindingsTy &Bindings) const override
Populates the given SmallVector with the bindings in the callee's stack frame at the start of this ca...
Definition: CallEvent.cpp:829
Represents a non-static C++ member function call.
Definition: CallEvent.h:794
const Expr * getArgExpr(unsigned Index) const override
Returns the expression associated with a given argument.
Definition: CallEvent.h:817
CXXMemberCall(const CXXMemberCall &Other)=default
const CXXMemberCallExpr * getOriginExpr() const override
Returns the expression whose value will be the result of this call.
Definition: CallEvent.h:807
static bool classof(const CallEvent *CA)
Definition: CallEvent.h:828
unsigned getNumArgs() const override
Returns the number of arguments (explicit and implicit).
Definition: CallEvent.h:811
CXXMemberCall(const CXXMemberCallExpr *CE, ProgramStateRef St, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.h:798
const Expr * getCXXThisExpr() const override
Returns the expression representing the implicit 'this' object.
Definition: CallEvent.cpp:871
StringRef getKindAsString() const override
Definition: CallEvent.h:826
void cloneTo(void *Dest) const override
Copies this CallEvent, with vtable intact, into a new block of memory.
Definition: CallEvent.h:804
RuntimeDefinition getRuntimeDefinition() const override
Returns the definition of the function or method that will be called.
Definition: CallEvent.cpp:875
Kind getKind() const override
Returns the kind of call this is.
Definition: CallEvent.h:825
Represents a C++ overloaded operator call where the operator is implemented as a non-static member fu...
Definition: CallEvent.h:837
std::optional< unsigned > getAdjustedParameterIndex(unsigned ASTArgumentIndex) const override
Some calls have parameter numbering mismatched from argument numbering.
Definition: CallEvent.h:874
OverloadedOperatorKind getOverloadedOperator() const
Definition: CallEvent.h:888
const Expr * getArgExpr(unsigned Index) const override
Returns the expression associated with a given argument.
Definition: CallEvent.h:860
unsigned getNumArgs() const override
Returns the number of arguments (explicit and implicit).
Definition: CallEvent.h:856
Kind getKind() const override
Returns the kind of call this is.
Definition: CallEvent.h:866
StringRef getKindAsString() const override
Definition: CallEvent.h:867
const Expr * getCXXThisExpr() const override
Returns the expression representing the implicit 'this' object.
Definition: CallEvent.cpp:887
void cloneTo(void *Dest) const override
Copies this CallEvent, with vtable intact, into a new block of memory.
Definition: CallEvent.h:847
CXXMemberOperatorCall(const CXXOperatorCallExpr *CE, ProgramStateRef St, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.h:841
const CXXOperatorCallExpr * getOriginExpr() const override
Returns the expression whose value will be the result of this call.
Definition: CallEvent.h:852
CXXMemberOperatorCall(const CXXMemberOperatorCall &Other)=default
unsigned getASTArgumentIndex(unsigned CallArgumentIndex) const override
Some call event sub-classes conveniently adjust mismatching AST indices to match parameter indices.
Definition: CallEvent.h:882
static bool classof(const CallEvent *CA)
Definition: CallEvent.h:869
Represents a static C++ operator call.
Definition: CallEvent.h:736
std::optional< unsigned > getAdjustedParameterIndex(unsigned ASTArgumentIndex) const override
Some calls have parameter numbering mismatched from argument numbering.
Definition: CallEvent.h:767
CXXStaticOperatorCall(const CXXStaticOperatorCall &Other)=default
void cloneTo(void *Dest) const override
Copies this CallEvent, with vtable intact, into a new block of memory.
Definition: CallEvent.h:746
OverloadedOperatorKind getOverloadedOperator() const
Definition: CallEvent.h:779
unsigned getNumArgs() const override
Returns the number of arguments (explicit and implicit).
Definition: CallEvent.h:755
StringRef getKindAsString() const override
Definition: CallEvent.h:784
Kind getKind() const override
Returns the kind of call this is.
Definition: CallEvent.h:783
const Expr * getArgExpr(unsigned Index) const override
Returns the expression associated with a given argument.
Definition: CallEvent.h:761
const CXXOperatorCallExpr * getOriginExpr() const override
Returns the expression whose value will be the result of this call.
Definition: CallEvent.h:751
CXXStaticOperatorCall(const CXXOperatorCallExpr *CE, ProgramStateRef St, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.h:740
static bool classof(const CallEvent *CA)
Definition: CallEvent.h:786
unsigned getASTArgumentIndex(unsigned CallArgumentIndex) const override
Some call event sub-classes conveniently adjust mismatching AST indices to match parameter indices.
Definition: CallEvent.h:774
Manages the lifetime of CallEvent objects.
Definition: CallEvent.h:1363
CallEventRef< CXXDestructorCall > getCXXDestructorCall(const CXXDestructorDecl *DD, const Stmt *Trigger, const MemRegion *Target, bool IsBase, ProgramStateRef State, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.h:1456
CallEventRef getCall(const Stmt *S, ProgramStateRef State, const LocationContext *LC, CFGBlock::ConstCFGElementRef ElemRef)
Gets a call event for a function call, Objective-C method call, a 'new', or a 'delete' call.
Definition: CallEvent.cpp:1508
CallEventRef< CXXDeallocatorCall > getCXXDeallocatorCall(const CXXDeleteExpr *E, ProgramStateRef State, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.h:1472
CallEventRef getSimpleCall(const CallExpr *E, ProgramStateRef State, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.cpp:1426
CallEventRef< ObjCMethodCall > getObjCMethodCall(const ObjCMessageExpr *E, ProgramStateRef State, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.h:1434
CallEventRef< CXXAllocatorCall > getCXXAllocatorCall(const CXXNewExpr *E, ProgramStateRef State, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.h:1465
CallEventRef< CXXConstructorCall > getCXXConstructorCall(const CXXConstructExpr *E, const MemRegion *Target, ProgramStateRef State, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.h:1441
CallEventRef< CXXInheritedConstructorCall > getCXXInheritedConstructorCall(const CXXInheritedCtorInitExpr *E, const MemRegion *Target, ProgramStateRef State, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.h:1448
CallEventManager(llvm::BumpPtrAllocator &alloc)
Definition: CallEvent.h:1417
CallEventRef getCaller(const StackFrameContext *CalleeCtx, ProgramStateRef State)
Gets an outside caller given a callee context.
Definition: CallEvent.cpp:1451
CallEventRef(const T *Call)
Definition: CallEvent.h:85
CallEventRef(const CallEventRef &Orig)
Definition: CallEvent.h:86
CallEventRef & operator=(const CallEventRef &)=delete
CallEventRef< T > cloneWithState(ProgramStateRef State) const
Definition: CallEvent.h:92
Represents an abstract call to a function or method along a particular path.
Definition: CallEvent.h:153
virtual SourceRange getArgSourceRange(unsigned Index) const
Returns the source range for errors associated with this argument.
Definition: CallEvent.cpp:314
virtual void getExtraInvalidatedValues(ValueList &Values, RegionAndSymbolInvalidationTraits *ETraits) const
Used to specify non-argument regions that will be invalidated as a result of this call.
Definition: CallEvent.h:211
virtual StringRef getKindAsString() const =0
void setForeign(bool B) const
Definition: CallEvent.h:232
virtual const Expr * getOriginExpr() const
Returns the expression whose value will be the result of this call.
Definition: CallEvent.h:250
virtual RuntimeDefinition getRuntimeDefinition() const =0
Returns the definition of the function or method that will be called.
CallEventRef cloneWithState(ProgramStateRef NewState) const
Returns a copy of this CallEvent, but using the given state.
Definition: CallEvent.h:382
static bool isCallStmt(const Stmt *S)
Returns true if this is a statement is a function or method call of some kind.
Definition: CallEvent.cpp:346
CallEvent & operator=(const CallEvent &)=delete
llvm::mapped_iterator< ArrayRef< ParmVarDecl * >::iterator, GetTypeFn > param_type_iterator
Definition: CallEvent.h:477
const ConstructionContext * getConstructionContext() const
Returns the construction context of the call, if it is a C++ constructor call or a call of a function...
Definition: CallEvent.cpp:504
param_type_iterator param_type_end() const
Definition: CallEvent.h:488
const ParamVarRegion * getParameterLocation(unsigned Index, unsigned BlockCount) const
Returns memory location for a parameter variable within the callee stack frame.
Definition: CallEvent.cpp:193
bool isCalledFromSystemHeader() const
Definition: CallEvent.cpp:534
const IdentifierInfo * getCalleeIdentifier() const
Returns the name of the callee, if its name is a simple identifier.
Definition: CallEvent.h:351
AnalysisDeclContext * getCalleeAnalysisDeclContext() const
Returns AnalysisDeclContext for the callee stack frame.
Definition: CallEvent.cpp:151
ProgramStateRef invalidateRegions(unsigned BlockCount, ProgramStateRef Orig=nullptr) const
Returns a new state with all argument regions invalidated.
Definition: CallEvent.cpp:232
virtual std::optional< unsigned > getAdjustedParameterIndex(unsigned ASTArgumentIndex) const
Some calls have parameter numbering mismatched from argument numbering.
Definition: CallEvent.h:434
const ProgramStateRef & getState() const
The state in which the call is being evaluated.
Definition: CallEvent.h:235
QualType getResultType() const
Returns the result type, adjusted for references.
Definition: CallEvent.cpp:70
CallEvent(const Expr *E, ProgramStateRef state, const LocationContext *lctx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.h:184
CallEventRef< T > cloneWithState(ProgramStateRef NewState) const
Returns a copy of this CallEvent, but using the given state.
Definition: CallEvent.h:1480
bool isInSystemHeader() const
Returns true if the callee is known to be from a system header.
Definition: CallEvent.h:262
bool isForeign() const
Definition: CallEvent.h:228
bool isGlobalCFunction(StringRef SpecificName=StringRef()) const
Returns true if the callee is an externally-visible function in the top-level namespace,...
Definition: CallEvent.cpp:143
virtual bool argumentsMayEscape() const
Returns true if any of the arguments are known to escape to long- term storage, even if this method w...
Definition: CallEvent.h:324
CallEvent(const CallEvent &Original)
Definition: CallEvent.h:193
param_type_iterator param_type_begin() const
Returns an iterator over the types of the call's formal parameters.
Definition: CallEvent.h:484
SourceLocation Location
Definition: CallEvent.h:171
const void * Data
Definition: CallEvent.h:166
std::pair< SVal, SVal > FrameBindingTy
Definition: CallEvent.h:369
ProgramPoint getProgramPoint(bool IsPreVisit=false, const ProgramPointTag *Tag=nullptr) const
Returns an appropriate ProgramPoint for this call.
Definition: CallEvent.cpp:287
virtual ~CallEvent()=default
const StackFrameContext * getCalleeStackFrame(unsigned BlockCount) const
Returns the callee stack frame.
Definition: CallEvent.cpp:163
static QualType getDeclaredResultType(const Decl *D)
Returns the result type of a function or method declaration.
Definition: CallEvent.cpp:350
SVal getSVal(const Stmt *S) const
Get the value of arbitrary expressions at this point in the path.
Definition: CallEvent.h:202
virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, BindingsTy &Bindings) const =0
Populates the given SmallVector with the bindings in the callee's stack frame at the start of this ca...
virtual void cloneTo(void *Dest) const =0
Copies this CallEvent, with vtable intact, into a new block of memory.
static bool isVariadic(const Decl *D)
Returns true if the given decl is known to be variadic.
Definition: CallEvent.cpp:379
virtual SVal getArgSVal(unsigned Index) const
Returns the value of a given argument at the time of the call.
Definition: CallEvent.cpp:307
bool hasNonNullArgumentsWithType(bool(*Condition)(QualType)) const
Returns true if the type of any of the non-null arguments satisfies the condition.
Definition: CallEvent.cpp:112
std::optional< SVal > getReturnValueUnderConstruction() const
If the call returns a C++ record type then the region of its return value can be retrieved from its c...
Definition: CallEvent.cpp:541
virtual const Expr * getArgExpr(unsigned Index) const
Returns the expression associated with a given argument.
Definition: CallEvent.h:293
virtual unsigned getNumArgs() const =0
Returns the number of arguments (explicit and implicit).
bool hasVoidPointerToNonConstArg() const
Returns true if any of the arguments is void*.
Definition: CallEvent.cpp:139
const CallEventRef getCaller() const
Definition: CallEvent.cpp:521
bool isArgumentConstructedDirectly(unsigned Index) const
Returns true if on the current path, the argument was constructed by calling a C++ constructor over i...
Definition: CallEvent.h:422
SmallVectorImpl< FrameBindingTy > BindingsTy
Definition: CallEvent.h:370
SVal getReturnValue() const
Returns the return value of the call.
Definition: CallEvent.cpp:321
virtual const Decl * getDecl() const
Returns the declaration of the function or method that will be called.
Definition: CallEvent.h:224
const LocationContext * getLocationContext() const
The context in which the call is being evaluated.
Definition: CallEvent.h:238
const CFGBlock::ConstCFGElementRef & getCFGElementRef() const
Definition: CallEvent.h:240
CallEvent(const Decl *D, ProgramStateRef state, const LocationContext *lctx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.h:188
virtual ArrayRef< ParmVarDecl * > parameters() const =0
Return call's formal parameters.
bool hasNonZeroCallbackArg() const
Returns true if any of the arguments appear to represent callbacks.
Definition: CallEvent.cpp:135
virtual Kind getKind() const =0
Returns the kind of call this is.
virtual SourceRange getSourceRange() const
Returns a source range for the entire call, suitable for outputting in diagnostics.
Definition: CallEvent.h:284
virtual unsigned getASTArgumentIndex(unsigned CallArgumentIndex) const
Some call event sub-classes conveniently adjust mismatching AST indices to match parameter indices.
Definition: CallEvent.h:441
bool isValid() const =delete
static std::optional< SVal > getObjectUnderConstruction(ProgramStateRef State, const ConstructionContextItem &Item, const LocationContext *LC)
By looking at a certain item that may be potentially part of an object's ConstructionContext,...
Definition: ExprEngine.cpp:604
MemRegion - The root abstract class for all memory regions.
Definition: MemRegion.h:98
Represents any expression that calls an Objective-C method.
Definition: CallEvent.h:1250
ObjCMethodCall(const ObjCMethodCall &Other)=default
const ObjCMethodDecl * getDecl() const override
Returns the declaration of the function or method that will be called.
Definition: CallEvent.h:1280
void getExtraInvalidatedValues(ValueList &Values, RegionAndSymbolInvalidationTraits *ETraits) const override
Used to specify non-argument regions that will be invalidated as a result of this call.
Definition: CallEvent.cpp:1002
static bool classof(const CallEvent *CA)
Definition: CallEvent.h:1351
bool isInstanceMessage() const
Definition: CallEvent.h:1290
const Expr * getArgExpr(unsigned Index) const override
Returns the expression associated with a given argument.
Definition: CallEvent.h:1286
ObjCMessageKind getMessageKind() const
Returns how the message was written in the source (property access, subscript, or explicit message se...
Definition: CallEvent.cpp:1088
unsigned getNumArgs() const override
Returns the number of arguments (explicit and implicit).
Definition: CallEvent.h:1284
bool isSetter() const
Returns true if this property access or subscript is a setter (has the form of an assignment).
Definition: CallEvent.h:1322
const ObjCMessageExpr * getOriginExpr() const override
Returns the expression whose value will be the result of this call.
Definition: CallEvent.h:1276
ObjCMethodFamily getMethodFamily() const
Definition: CallEvent.h:1294
ObjCMethodCall(const ObjCMessageExpr *Msg, ProgramStateRef St, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.h:1256
ArrayRef< ParmVarDecl * > parameters() const override
Return call's formal parameters.
Definition: CallEvent.cpp:995
StringRef getKindAsString() const override
Definition: CallEvent.h:1349
SourceRange getSourceRange() const override
Returns a source range for the entire call, suitable for outputting in diagnostics.
Definition: CallEvent.cpp:1057
virtual bool canBeOverridenInSubclass(ObjCInterfaceDecl *IDecl, Selector Sel) const
Check if the selector may have multiple definitions (may have overrides).
Definition: CallEvent.cpp:1154
bool argumentsMayEscape() const override
Returns true if any of the arguments are known to escape to long- term storage, even if this method w...
Definition: CallEvent.cpp:1397
SVal getReceiverSVal() const
Returns the value of the receiver at the time of this call.
Definition: CallEvent.cpp:1027
RuntimeDefinition getRuntimeDefinition() const override
Returns the definition of the function or method that will be called.
Definition: CallEvent.cpp:1294
void cloneTo(void *Dest) const override
Copies this CallEvent, with vtable intact, into a new block of memory.
Definition: CallEvent.h:1265
const ObjCInterfaceDecl * getReceiverInterface() const
Get the interface for the receiver.
Definition: CallEvent.h:1309
bool isReceiverSelfOrSuper() const
Checks if the receiver refers to 'self' or 'super'.
Definition: CallEvent.cpp:1043
Selector getSelector() const
Definition: CallEvent.h:1298
const ObjCPropertyDecl * getAccessedProperty() const
Definition: CallEvent.cpp:1132
Kind getKind() const override
Returns the kind of call this is.
Definition: CallEvent.h:1348
void getInitialStackFrameContents(const StackFrameContext *CalleeCtx, BindingsTy &Bindings) const override
Populates the given SmallVector with the bindings in the callee's stack frame at the start of this ca...
Definition: CallEvent.cpp:1408
ParamVarRegion - Represents a region for parameters.
Definition: MemRegion.h:1062
Information about invalidation for a particular region/symbol.
Definition: MemRegion.h:1657
Defines the runtime definition of the called function.
Definition: CallEvent.h:110
RuntimeDefinition(const Decl *InD, const MemRegion *InR)
Definition: CallEvent.h:129
RuntimeDefinition(const Decl *InD, bool Foreign)
Definition: CallEvent.h:128
const MemRegion * getDispatchRegion()
When other definitions are possible, returns the region whose runtime type determines the method defi...
Definition: CallEvent.h:141
RuntimeDefinition(const Decl *InD)
Definition: CallEvent.h:127
bool mayHaveOtherDefinitions()
Check if the definition we have is precise.
Definition: CallEvent.h:137
SVal - This represents a symbolic expression, which can be either an L-value or an R-value.
Definition: SVals.h:56
Represents a C function or static C++ member function call.
Definition: CallEvent.h:536
static bool classof(const CallEvent *CA)
Definition: CallEvent.h:568
Kind getKind() const override
Returns the kind of call this is.
Definition: CallEvent.h:565
unsigned getNumArgs() const override
Returns the number of arguments (explicit and implicit).
Definition: CallEvent.h:559
SimpleFunctionCall(const CallExpr *CE, ProgramStateRef St, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Definition: CallEvent.h:540
void cloneTo(void *Dest) const override
Copies this CallEvent, with vtable intact, into a new block of memory.
Definition: CallEvent.h:546
SimpleFunctionCall(const SimpleFunctionCall &Other)=default
StringRef getKindAsString() const override
Definition: CallEvent.h:566
RuntimeDefinition getRuntimeDefinition() const override
Returns the definition of the function or method that will be called.
Definition: CallEvent.cpp:693
const Expr * getArgExpr(unsigned Index) const override
Returns the expression associated with a given argument.
Definition: CallEvent.h:561
const CallExpr * getOriginExpr() const override
Returns the expression whose value will be the result of this call.
Definition: CallEvent.h:551
const FunctionDecl * getDecl() const override
Returns the declaration of the function or method that will be called.
Definition: CallEvent.cpp:685
const VarDecl * getDecl() const override=0
IntrusiveRefCntPtr< const ProgramState > ProgramStateRef
@ CE_CXXMember
Definition: CallEvent.h:63
@ CE_ObjCMessage
Definition: CallEvent.h:77
@ CE_END_CXX_CONSTRUCTOR_CALLS
Definition: CallEvent.h:71
@ CE_CXXInheritedConstructor
Definition: CallEvent.h:69
@ CE_END_FUNCTION_CALLS
Definition: CallEvent.h:75
@ CE_CXXStaticOperator
Definition: CallEvent.h:62
@ CE_END_CXX_INSTANCE_CALLS
Definition: CallEvent.h:67
@ CE_CXXDestructor
Definition: CallEvent.h:65
@ CE_BEG_CXX_INSTANCE_CALLS
Definition: CallEvent.h:66
@ CE_CXXDeallocator
Definition: CallEvent.h:73
@ CE_CXXAllocator
Definition: CallEvent.h:72
@ CE_CXXConstructor
Definition: CallEvent.h:68
@ CE_BEG_CXX_CONSTRUCTOR_CALLS
Definition: CallEvent.h:70
@ CE_CXXMemberOperator
Definition: CallEvent.h:64
@ CE_BEG_FUNCTION_CALLS
Definition: CallEvent.h:74
ObjCMessageKind
Represents the ways an Objective-C message send can occur.
Definition: CallEvent.h:1245
@ OCM_PropertyAccess
Definition: CallEvent.h:1245
const Fact * ProgramPoint
A ProgramPoint identifies a location in the CFG by pointing to a specific Fact.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
Definition: OperatorKinds.h:21
ObjCMethodFamily
A family of Objective-C methods.
const FunctionProtoType * T
@ Other
Other implicit parameter.
Diagnostic wrappers for TextAPI types for error reporting.
Definition: Dominators.h:30
static SimpleType getSimplifiedValue(clang::ento::CallEventRef< T > Val)
Definition: CallEvent.h:1520