30class DynamicTypeChecker :
public Checker<check::PostStmt<ImplicitCastExpr>> {
31 const BugType BT{
this,
"Dynamic and static type mismatch",
"Type Error"};
35 DynamicTypeBugVisitor(
const MemRegion *Reg) : Reg(Reg) {}
37 void Profile(llvm::FoldingSetNodeID &ID)
const override {
64 const Stmt *ReportedNode,
67 llvm::raw_svector_ostream OS(Buf);
68 OS <<
"Object has a dynamic type '";
71 OS <<
"' which is incompatible with static type '";
75 auto R = std::make_unique<PathSensitiveBugReport>(
76 BT, OS.str(),
C.generateNonFatalErrorNode());
77 R->markInteresting(Reg);
78 R->addVisitor(std::make_unique<DynamicTypeBugVisitor>(Reg));
80 C.emitReport(std::move(R));
93 if (TrackedTypePrev.
isValid() &&
105 llvm::raw_svector_ostream OS(Buf);
108 LangOpts, llvm::Twine());
109 OS <<
"' is inferred from ";
111 if (
const auto *ExplicitCast = dyn_cast<ExplicitCastExpr>(S)) {
112 OS <<
"explicit cast (from '";
117 LangOpts, llvm::Twine());
119 }
else if (
const auto *ImplicitCast = dyn_cast<ImplicitCastExpr>(S)) {
120 OS <<
"implicit cast (from '";
125 LangOpts, llvm::Twine());
128 OS <<
"this context";
134 return std::make_shared<PathDiagnosticEventPiece>(Pos, OS.str(),
true);
142 return Decl->getDefinition();
152 const MemRegion *Region =
C.getSVal(CE).getAsRegion();
168 if (!DynObjCType || !StaticObjCType)
177 DynObjCType = DynObjCType->stripObjCKindOfTypeAndQuals(ASTCtxt);
191 reportTypeError(DynType, StaticType, Region, CE,
C);
198bool ento::shouldRegisterDynamicTypeChecker(
const CheckerManager &mgr) {
static bool hasDefinition(const ObjCObjectPointerType *ObjPtr)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
bool canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)
canAssignObjCInterfaces - Return true if the two interface types are compatible for assignment from R...
const LangOptions & getLangOpts() const
CastKind getCastKind() const
Decl - This represents one declaration (or definition), e.g.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Represents an ObjC class declaration.
Represents a pointer to an Objective C object.
bool isSpecialized() const
Whether this type is specialized, meaning that it has type arguments.
const ObjCObjectPointerType * stripObjCKindOfTypeAndQuals(const ASTContext &ctx) const
Strip off the Objective-C "kindof" type and (with it) any protocol qualifiers.
ObjCInterfaceDecl * getInterfaceDecl() const
If this pointer points to an Objective @interface type, gets the declaration for that interface.
A (possibly-)qualified type.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
void print(raw_ostream &OS, const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
The collection of all-type qualifiers we support.
Stmt - This represents one statement.
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
const T * getAs() const
Member-template getAs<specific type>'.
ASTContext & getASTContext() const
const SourceManager & getSourceManager() const
BugReporterVisitors are used to add custom diagnostics along a path.
CHECKER * registerChecker(AT &&...Args)
Register a single-part checker (derived from Checker): construct its singleton instance,...
Simple checker classes that implement one frontend (i.e.
Stores the currently inferred strictest bound on the runtime type of a region in a given state along ...
bool canBeASubClass() const
Returns false if the type information is precise (the type 'DynTy' is the only type in the lattice),...
QualType getType() const
Returns the currently inferred upper bound on the runtime type.
bool isValid() const
Returns true if the dynamic type info is available.
const ProgramStateRef & getState() const
const Stmt * getStmtForDiagnostics() const
If the node's program point corresponds to a statement, retrieve that statement.
const LocationContext * getLocationContext() const
ExplodedNode * getFirstPred()
MemRegion - The root abstract class for all memory regions.
DynamicTypeInfo getDynamicTypeInfo(ProgramStateRef State, const MemRegion *MR)
Get dynamic type information for the region MR.
std::shared_ptr< PathDiagnosticPiece > PathDiagnosticPieceRef
The JSON file list parser is used to communicate input to InstallAPI.