clang 22.0.0git
ExprEngineCallAndReturn.cpp File Reference

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "ExprEngine"

Functions

 STAT_COUNTER (NumOfDynamicDispatchPathSplits, "The # of times we split the path due to imprecise dynamic dispatch info")
 STAT_COUNTER (NumInlinedCalls, "The # of times we inlined a call")
 STAT_COUNTER (NumReachedInlineCountMax, "The # of times we reached inline count maximum")
static std::pair< const Stmt *, const CFGBlock * > getLastStmt (const ExplodedNode *Node)
static SVal adjustReturnValue (SVal V, QualType ExpectedTy, QualType ActualTy, StoreManager &StoreMgr)
 Adjusts a return value when the called function's return type does not match the caller's expression type.
static bool wasDifferentDeclUsedForInlining (CallEventRef<> Call, const StackFrameContext *calleeCtx)
static unsigned getElementCountOfArrayBeingDestructed (const CallEvent &Call, const ProgramStateRef State, SValBuilder &SVB)
 REGISTER_MAP_WITH_PROGRAMSTATE (DynamicDispatchBifurcationMap, const MemRegion *, unsigned) void ExprEngine
static ProgramStateRef getInlineFailedState (ProgramStateRef State, const Stmt *CallE)
static bool hasMember (const ASTContext &Ctx, const CXXRecordDecl *RD, StringRef Name)
 Returns true if the given C++ class contains a member with the given name.
static bool isContainerClass (const ASTContext &Ctx, const CXXRecordDecl *RD)
 Returns true if the given C++ class is a container or iterator.
static bool isContainerMethod (const ASTContext &Ctx, const FunctionDecl *FD)
 Returns true if the given function refers to a method of a C++ container or iterator.
static bool isCXXSharedPtrDtor (const FunctionDecl *FD)
 Returns true if the given function is the destructor of a class named "shared_ptr".
static bool isTrivialObjectAssignment (const CallEvent &Call)

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "ExprEngine"

Definition at line 31 of file ExprEngineCallAndReturn.cpp.

Function Documentation

◆ adjustReturnValue()

SVal adjustReturnValue ( SVal V,
QualType ExpectedTy,
QualType ActualTy,
StoreManager & StoreMgr )
static

Adjusts a return value when the called function's return type does not match the caller's expression type.

This can happen when a dynamic call is devirtualized, and the overriding method has a covariant (more specific) return type than the parent's method. For C++ objects, this means we need to add base casts.

Definition at line 126 of file ExprEngineCallAndReturn.cpp.

References clang::ento::StoreManager::evalDerivedToBase(), clang::ExpectedClass, clang::CXXBasePaths::front(), clang::QualType::getCanonicalType(), clang::Type::getCanonicalTypeUnqualified(), clang::Type::getPointeeCXXRecordDecl(), clang::isa(), clang::CXXBasePaths::isAmbiguous(), clang::CXXRecordDecl::isDerivedFrom(), clang::Type::isObjCObjectPointerType(), and V.

Referenced by clang::ento::ExprEngine::processCallExit().

◆ getElementCountOfArrayBeingDestructed()

unsigned getElementCountOfArrayBeingDestructed ( const CallEvent & Call,
const ProgramStateRef State,
SValBuilder & SVB )
static

◆ getInlineFailedState()

ProgramStateRef getInlineFailedState ( ProgramStateRef State,
const Stmt * CallE )
static

◆ getLastStmt()

◆ hasMember()

bool hasMember ( const ASTContext & Ctx,
const CXXRecordDecl * RD,
StringRef Name )
static

Returns true if the given C++ class contains a member with the given name.

Definition at line 967 of file ExprEngineCallAndReturn.cpp.

References clang::ASTContext::DeclarationNames, clang::IdentifierTable::get(), clang::DeclarationNameTable::getIdentifier(), clang::CXXRecordDecl::hasMemberName(), and clang::ASTContext::Idents.

Referenced by isContainerClass().

◆ isContainerClass()

bool isContainerClass ( const ASTContext & Ctx,
const CXXRecordDecl * RD )
static

Returns true if the given C++ class is a container or iterator.

Our heuristic for this is whether it contains a method named 'begin()' or a nested type named 'iterator' or 'iterator_category'.

Definition at line 977 of file ExprEngineCallAndReturn.cpp.

References hasMember().

Referenced by isContainerMethod().

◆ isContainerMethod()

bool isContainerMethod ( const ASTContext & Ctx,
const FunctionDecl * FD )
static

Returns true if the given function refers to a method of a C++ container or iterator.

We generally do a poor job modeling most containers right now, and might prefer not to inline their methods.

Definition at line 988 of file ExprEngineCallAndReturn.cpp.

References isContainerClass().

◆ isCXXSharedPtrDtor()

bool isCXXSharedPtrDtor ( const FunctionDecl * FD)
static

Returns true if the given function is the destructor of a class named "shared_ptr".

Definition at line 997 of file ExprEngineCallAndReturn.cpp.

References clang::DeclarationName::getAsIdentifierInfo(), clang::NamedDecl::getDeclName(), and clang::CXXMethodDecl::getParent().

◆ isTrivialObjectAssignment()

◆ REGISTER_MAP_WITH_PROGRAMSTATE()

◆ STAT_COUNTER() [1/3]

STAT_COUNTER ( NumInlinedCalls ,
"The # of times we inlined a call"  )

◆ STAT_COUNTER() [2/3]

STAT_COUNTER ( NumOfDynamicDispatchPathSplits ,
"The # of times we split the path due to imprecise dynamic dispatch info"  )

◆ STAT_COUNTER() [3/3]

STAT_COUNTER ( NumReachedInlineCountMax ,
"The # of times we reached inline count maximum"  )

◆ wasDifferentDeclUsedForInlining()

bool wasDifferentDeclUsedForInlining ( CallEventRef<> Call,
const StackFrameContext * calleeCtx )
static