clang 20.0.0git
|
#include "clang/AST/ParentMap.h"
#include "clang/AST/RecursiveASTVisitor.h"
#include "clang/Basic/Builtins.h"
#include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h"
#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
#include "clang/StaticAnalyzer/Core/Checker.h"
#include "clang/StaticAnalyzer/Core/CheckerManager.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/DynamicType.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h"
#include "llvm/ADT/STLExtras.h"
#include <optional>
Go to the source code of this file.
Functions | |
REGISTER_MAP_WITH_PROGRAMSTATE (MostSpecializedTypeArgsMap, SymbolRef, const ObjCObjectPointerType *) namespace | |
static void | recordFixedType (const MemRegion *Region, const CXXMethodDecl *MD, CheckerContext &C) |
static const ObjCObjectPointerType * | getMostInformativeDerivedClassImpl (const ObjCObjectPointerType *From, const ObjCObjectPointerType *To, const ObjCObjectPointerType *MostInformativeCandidate, ASTContext &C) |
static const ObjCObjectPointerType * | getMostInformativeDerivedClass (const ObjCObjectPointerType *From, const ObjCObjectPointerType *To, ASTContext &C) |
A downcast may loose specialization information. E. g.: MutableMap<T, U> : Map The downcast to MutableMap looses the information about the types of the Map (due to the type parameters are not being forwarded to Map), and in general there is no way to recover that information from the declaration. In order to have to most information, lets find the most derived type that has all the type parameters forwarded. | |
static bool | storeWhenMoreInformative (ProgramStateRef &State, SymbolRef Sym, const ObjCObjectPointerType *const *Current, const ObjCObjectPointerType *StaticLowerBound, const ObjCObjectPointerType *StaticUpperBound, ASTContext &C) |
Inputs: | |
static const Expr * | stripCastsAndSugar (const Expr *E) |
static bool | isObjCTypeParamDependent (QualType Type) |
static const ObjCMethodDecl * | findMethodDecl (const ObjCMessageExpr *MessageExpr, const ObjCObjectPointerType *TrackedType, ASTContext &ASTCtxt) |
A method might not be available in the interface indicated by the static type. However it might be available in the tracked type. In order to properly substitute the type parameters we need the declaration context of the method. The more specialized the enclosing class of the method is, the more likely that the parameter substitution will be successful. | |
static QualType | getReturnTypeForMethod (const ObjCMethodDecl *Method, ArrayRef< QualType > TypeArgs, const ObjCObjectPointerType *SelfType, ASTContext &C) |
Get the returned ObjCObjectPointerType by a method based on the tracked type information, or null pointer when the returned type is not an ObjCObjectPointerType. | |
|
static |
A method might not be available in the interface indicated by the static type. However it might be available in the tracked type. In order to properly substitute the type parameters we need the declaration context of the method. The more specialized the enclosing class of the method is, the more likely that the parameter substitution will be successful.
Definition at line 739 of file DynamicTypePropagation.cpp.
References clang::ASTContext::canAssignObjCInterfaces(), clang::Type::castAs(), clang::ObjCMessageExpr::Class, clang::ObjCObjectPointerType::getInterfaceDecl(), clang::ObjCMessageExpr::getMethodDecl(), clang::ObjCMessageExpr::getReceiverKind(), clang::ObjCMessageExpr::getReceiverType(), clang::ObjCMessageExpr::getSelector(), clang::ObjCMessageExpr::Instance, clang::Type::isObjCClassType(), clang::Type::isObjCIdType(), clang::ObjCInterfaceDecl::lookupClassMethod(), and clang::ObjCInterfaceDecl::lookupInstanceMethod().
|
static |
A downcast may loose specialization information. E. g.: MutableMap<T, U> : Map The downcast to MutableMap looses the information about the types of the Map (due to the type parameters are not being forwarded to Map), and in general there is no way to recover that information from the declaration. In order to have to most information, lets find the most derived type that has all the type parameters forwarded.
Get the a subclass of From
(which has a lower bound To
) that do not loose information about type parameters. To
has to be a subclass of From
. From has to be specialized.
Definition at line 512 of file DynamicTypePropagation.cpp.
References clang::C, and getMostInformativeDerivedClassImpl().
Referenced by storeWhenMoreInformative().
|
static |
Definition at line 466 of file DynamicTypePropagation.cpp.
References clang::C, clang::Type::castAs(), clang::ObjCInterfaceDecl::getCanonicalDecl(), clang::ObjCObjectPointerType::getInterfaceDecl(), getMostInformativeDerivedClassImpl(), clang::ObjCObjectPointerType::getObjectType(), clang::ObjCObjectType::getSuperClassType(), clang::QualType::isNull(), clang::ObjCObjectPointerType::isSpecialized(), and clang::ObjCObjectPointerType::isUnspecialized().
Referenced by getMostInformativeDerivedClass(), and getMostInformativeDerivedClassImpl().
|
static |
Get the returned ObjCObjectPointerType by a method based on the tracked type information, or null pointer when the returned type is not an ObjCObjectPointerType.
Definition at line 772 of file DynamicTypePropagation.cpp.
References clang::C, clang::ObjCMethodDecl::getReturnType(), isObjCTypeParamDependent(), and clang::QualType::substObjCTypeArgs().
Definition at line 709 of file DynamicTypePropagation.cpp.
Referenced by getReturnTypeForMethod().
|
static |
Definition at line 246 of file DynamicTypePropagation.cpp.
References clang::C, clang::CXXMethodDecl::getParent(), clang::ASTContext::getPointerType(), clang::ASTContext::getRecordType(), and clang::ento::setDynamicTypeInfo().
REGISTER_MAP_WITH_PROGRAMSTATE | ( | MostSpecializedTypeArgsMap | , |
SymbolRef | , | ||
const ObjCObjectPointerType * | |||
) |
Return a better dynamic type if one can be derived from the cast.
This value is set to true, when the Generics checker is turned on.
Definition at line 48 of file DynamicTypePropagation.cpp.
References bool, clang::C, clang::Call, clang::ObjCMessageExpr::Class, clang::ento::categories::CoreFoundationObjectiveC, clang::Type::getAs(), clang::ento::SVal::getAsRegion(), clang::ento::SVal::getAsSymbol(), clang::QualType::getCanonicalType(), clang::ento::getClassObjectDynamicTypeInfo(), clang::ObjCMessageExpr::getClassReceiver(), clang::ento::getDynamicTypeInfo(), clang::ObjCMessageExpr::getInstanceReceiver(), clang::ObjCMessageExpr::getReceiverKind(), clang::ObjCMessageExpr::getSuperType(), ID, clang::QualType::isNull(), clang::ObjCMessageExpr::SuperClass, clang::ObjCMessageExpr::SuperInstance, and X.
|
static |
Inputs:
StaticLowerBound | Static lower bound for a symbol. The dynamic lower bound might be the subclass of this type. |
StaticUpperBound | A static upper bound for a symbol. StaticLowerBound expected to be the subclass of StaticUpperBound . |
Current | The type that was inferred for a symbol in a previous context. Might be null when this is the first time that inference happens. Precondition: StaticLowerBound or StaticUpperBound is specialized. If Current is not null, it is specialized. Possible cases: (1) The Current is null and StaticLowerBound <: StaticUpperBound (2) StaticLowerBound <: Current <: StaticUpperBound (3) Current <: StaticLowerBound <: StaticUpperBound (4) StaticLowerBound <: StaticUpperBound <: Current Effect: Use getMostInformativeDerivedClass with the upper and lower bound of the set {StaticLowerBound , Current , StaticUpperBound} . The computed lower bound must be specialized. If the result differs from Current or Current is null, store the result. |
Definition at line 538 of file DynamicTypePropagation.cpp.
References clang::C, getMostInformativeDerivedClass(), clang::ObjCObjectPointerType::isSpecialized(), and clang::ObjCObjectPointerType::isUnspecialized().
Definition at line 700 of file DynamicTypePropagation.cpp.
References E, and clang::Expr::IgnoreParenImpCasts().