clang: lib/Analysis/FlowSensitive/Models/UncheckedStatusOrAccessModel.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
10
11#include
12#include
13
33#include "llvm/ADT/StringMap.h"
34
36namespace {
37
38using ::clang::ast_matchers::MatchFinder;
40
41}
42
45 while (!NamespaceNames.empty() && NS) {
46 if (NS->getName() != NamespaceNames.consume_back())
47 return false;
48 NS = dyn_cast_or_null(NS->getParent());
49 }
50 return NamespaceNames.empty() && !NS;
51}
52
53
55 StringRef Name) {
56 if (Type.isNull())
57 return false;
59 if (RD->getName() == Name)
60 if (const auto *N = dyn_cast_or_null(RD->getDeclContext()))
62 return false;
63}
64
66 return isTypeNamed(Type, {"absl", "internal_statusor"}, "OperatorBase");
67}
68
71 if (!StatusOrLoc)
72 return false;
75 return OkVal != nullptr && Env.proves(OkVal->formula());
76}
77
81 if (RD == nullptr)
82 return nullptr;
84
85
88 if (!RD->hasDefinition())
89 return nullptr;
90 for (const auto &Base : RD->bases())
92 return QT;
93 return nullptr;
94}
95
99
102 return ofClass(hasName("::absl::Status"));
103}
104
111
120
128
134
140
148
153
157 "::absl::AbortedError", "::absl::AlreadyExistsError",
158 "::absl::CancelledError", "::absl::DataLossError",
159 "::absl::DeadlineExceededError", "::absl::FailedPreconditionError",
160 "::absl::InternalError", "::absl::InvalidArgumentError",
161 "::absl::NotFoundError", "::absl::OutOfRangeError",
162 "::absl::PermissionDeniedError", "::absl::ResourceExhaustedError",
163 "::absl::UnauthenticatedError", "::absl::UnavailableError",
164 "::absl::UnimplementedError", "::absl::UnknownError"))));
165}
166
175
176
177
178
179
185 hasArgument(1, anyOf(hasType(hasUnqualifiedDesugaredType(
186 type(equalsBoundNode("T")))),
187 nullPointerConstant())));
188}
189
194 hasArgument(0,
195 anyOf(hasType(hasCanonicalType(type(equalsBoundNode("T")))),
196 nullPointerConstant(),
198 "std::in_place_t"))))));
199}
200
205
215
221
228
235
240
247
254
258 parameterCountIs(0), isConst(),
260}
261
265 parameterCountIs(0), isConst(),
267}
268
273
278
283 hasName("::testing::internal::MakePredicateFormatterFromMatcher"))),
284 hasArgument(
286 "::testing::status::internal_status::IsOkMatcher",
287 "::absl_testing::status_internal::IsOkMatcher",
288 "::testing::status::internal_status::IsOkAndHoldsMatcher",
289 "::absl_testing::status_internal::IsOkAndHoldsMatcher")))));
290}
291
295 "::testing::status::StatusIs", "absl_testing::StatusIs",
296 "::testing::status::CanonicalStatusIs",
297 "::absl_testing::CanonicalStatusIs"))),
299 "::absl::StatusCode::kOk", "OK"))))));
300}
301
306 hasName("::testing::internal::MakePredicateFormatterFromMatcher"))),
308 "::testing::status::internal_status::StatusIsMatcher",
309 "::testing::status::internal_status::"
310 "CanonicalStatusIsMatcher",
311 "::absl_testing::status_internal::StatusIsMatcher",
312 "::absl_testing::status_internal::"
313 "CanonicalStatusIsMatcher")))));
314}
315
321 hasName("testing::internal::PredicateFormatterFromMatcher")))),
322 hasArgument(2, hasType(statusType())));
323}
324
330 hasName("testing::internal::PredicateFormatterFromMatcher")))),
332}
333
339 ofClass(hasName("testing::AssertionResult")))));
340}
341
346 hasArgument(0, hasType(booleanType())));
347}
348
354
360
364 pointerType(pointee(hasUnqualifiedDesugaredType(
366}
367
368static auto
372
373 .CaseOfCFGStmt(
381 })
382
383
384 .CaseOfCFGStmt(
394 })
395 .Build();
396}
397
401
405 &State) {
406 return DiagnoseMatchSwitch(Elt, Ctx, State.Env);
407}
408
415
420
424 hasName("absl::StatusOr"),
425 hasTemplateArgument(0, refersToType(type().bind("T"))));
426}
427
432
436 hasName("absl::internal_statusor::OperatorBase"));
437}
438
443
448
452
456
459 "PredicateFormatterFromMatcher");
460}
461
465
467 return isTypeNamed(Type, {"testing", "status", "internal_status"},
468 "StatusIsMatcher") ||
469 isTypeNamed(Type, {"testing", "status", "internal_status"},
470 "CanonicalStatusIsMatcher") ||
472 "StatusIsMatcher") ||
474 "CanonicalStatusIsMatcher");
475}
476
492
496
500
509
513
519 if (StatusOrLoc == nullptr)
520 return;
521
523 State.Env.setValue(*Expr, OkVal);
524}
525
531 if (StatusOrLoc == nullptr)
532 return;
533
535
536 if (State.Env.getValue(locForOk(StatusLoc)) == nullptr)
538
540 copyRecord(StatusLoc, State.Env.getResultObjectLocation(*Expr), State.Env);
541 else
542 State.Env.setStorageLocation(*Expr, StatusLoc);
543}
544
550 if (StatusLoc == nullptr)
551 return;
552
553 if (Value *Val = State.Env.getValue(locForOk(*StatusLoc)))
554 State.Env.setValue(*Expr, *Val);
555}
556
560
561
562 assert(Expr->getNumArgs() == 1);
563 auto *Arg = Expr->getArg(0);
565 Arg->isPRValue() ? &State.Env.getResultObjectLocation(*Arg)
568 if (ThisLoc == nullptr || ArgRecord == nullptr)
569 return;
570
571 auto &ThisOkVal = valForOk(*ThisLoc, State.Env);
572 auto &ArgOkVal = valForOk(*ArgRecord, State.Env);
573 auto &A = State.Env.arena();
574 auto &NewVal = State.Env.makeAtomicBoolValue();
575 State.Env.assume(A.makeImplies(A.makeNot(ThisOkVal.formula()),
576 A.makeNot(NewVal.formula())));
577 State.Env.assume(A.makeImplies(NewVal.formula(), ArgOkVal.formula()));
578 State.Env.setValue(locForOk(*ThisLoc), NewVal);
579}
580
584 auto &A = Env.arena();
585
586
587
588
589
590
591
592
593
594 auto &LhsOkVal = valForOk(LhsStatusLoc, Env);
595 auto &RhsOkVal = valForOk(RhsStatusLoc, Env);
596
598
599
600 Env.assume(A.makeImplies(A.makeAnd(LhsOkVal.formula(), RhsOkVal.formula()),
601 Res.formula()));
602
603 Env.assume(A.makeImplies(
604 Res.formula(), A.makeEquals(LhsOkVal.formula(), RhsOkVal.formula())));
605
606 return &Res;
607}
608
613 auto &A = Env.arena();
614
615
616
617
618
619
620
621
622
626
627
628 Env.assume(A.makeImplies(
629 res.formula(), A.makeEquals(LhsOkVal.formula(), RhsOkVal.formula())));
630 return &res;
631}
632
635
636
640 if (LhsStatusOrLoc == nullptr)
641 return nullptr;
643 if (RhsStatusOrLoc == nullptr)
644 return nullptr;
645
647 }
650 if (LhsStatusLoc == nullptr)
651 return nullptr;
652
654 if (RhsStatusLoc == nullptr)
655 return nullptr;
656
658 }
659 return nullptr;
660}
661
664 bool IsNegative) {
665 auto *LhsAndRhsVal =
667 if (LhsAndRhsVal == nullptr)
668 return;
669
670 if (IsNegative)
671 State.Env.setValue(*Expr, State.Env.makeNot(*LhsAndRhsVal));
672 else
673 State.Env.setValue(*Expr, *LhsAndRhsVal);
674}
675
679 return dyn_cast(&PointerVal->getPointeeLoc());
680 return nullptr;
681}
682
684 const Expr *RhsExpr,
694 if (LhsStatusOrLoc == nullptr || RhsStatusOrLoc == nullptr)
695 return nullptr;
696 LhsStatusLoc = &locForStatus(*LhsStatusOrLoc);
697 RhsStatusLoc = &locForStatus(*RhsStatusOrLoc);
702 }
703 if (LhsStatusLoc == nullptr || RhsStatusLoc == nullptr)
704 return nullptr;
705 auto &LhsOkVal = valForOk(*LhsStatusLoc, Env);
706 auto &RhsOkVal = valForOk(*RhsStatusLoc, Env);
708 auto &A = Env.arena();
709 Env.assume(A.makeImplies(
710 Res.formula(), A.makeEquals(LhsOkVal.formula(), RhsOkVal.formula())));
711 return &Res;
712}
713
716 bool IsNegative) {
717 auto *LhsAndRhsVal =
719 if (LhsAndRhsVal == nullptr)
720 return;
721
722 if (IsNegative)
723 State.Env.setValue(*Expr, State.Env.makeNot(*LhsAndRhsVal));
724 else
725 State.Env.setValue(*Expr, *LhsAndRhsVal);
726}
727
731 auto &OkVal =
733 State.Env.assume(OkVal.formula());
734}
735
739 auto &OkVal =
741 auto &A = State.Env.arena();
742 State.Env.assume(A.makeNot(OkVal.formula()));
743}
744
750 if (StatusOrLoc == nullptr)
751 return;
752
754 State.Env.assume(OkVal.formula());
755}
756
760 assert(Expr->getNumArgs() > 1);
761
763 if (StatusOrLoc == nullptr)
764 return;
765
767 State.Env.assume(OkVal.formula());
768}
769
773 auto &OkVal =
775 State.Env.assume(OkVal.formula());
776}
777
783
784 if (State.Env.getValue(locForOk(StatusLoc)) == nullptr)
786}
787
792
793 if (State.Env.getValue(locForOk(StatusLoc)) == nullptr)
795}
796static void
800 assert(Expr->getNumArgs() == 1);
802 return;
803 auto *ArgLoc = State.Env.getStorageLocation(*Expr->getArg(0));
804 if (ArgLoc == nullptr)
805 return;
806
807 State.Env.setStorageLocation(*Expr, *ArgLoc);
808}
809
813 assert(Expr->getNumArgs() > 2);
814
816 if (EqVal == nullptr)
817 return;
818
819
820
821
822 State.Env.setValue(*Expr, State.Env.makeNot(*EqVal));
823}
824
828 assert(Expr->getNumArgs() == 1);
829
831 if (ArgLoc == nullptr)
832 return;
833
834 if (State.Env.getValue(locForOk(*ArgLoc)) == nullptr)
836
837 auto &ExprVal = State.Env.create<PointerValue>(*ArgLoc);
838 State.Env.setValue(*Expr, ExprVal);
839}
840
844 assert(Expr->getNumArgs() == 1);
845
847 if (ArgLoc == nullptr)
848 return;
849
851
852 if (State.Env.getValue(locForOk(StatusLoc)) == nullptr)
854
855 auto &ExprVal = State.Env.create<PointerValue>(StatusLoc);
856 State.Env.setValue(*Expr, ExprVal);
857}
858
862 if (auto *SubExprVal =
863 dyn_cast_or_null(State.Env.getValue(*Expr->getSubExpr())))
864 State.Env.setValue(*Expr, *SubExprVal);
865}
866
872 if (StatusOrLoc != nullptr &&
875}
876
882 return false;
884 if (DirectCallee == nullptr)
885 return false;
887 State.Lattice.getOrCreateConstMethodReturnStorageLocation(
889 initializeStatusOr(cast(Loc), State.Env);
890 });
892 auto &ResultLoc = State.Env.getResultObjectLocation(*Expr);
894 } else {
895 State.Env.setStorageLocation(*Expr, Loc);
896 }
897 return true;
898}
899
910 return;
911 auto *Val = State.Lattice.getOrCreateConstMethodReturnValue(*RecordLoc, Expr,
912 State.Env);
913 State.Env.setValue(*Expr, *Val);
914}
915
916static void
923
927 auto *RecordLoc = cast_or_null(
928 State.Env.getStorageLocation(*Expr->getArg(0)));
930}
931
938
942 auto *RecordLoc = cast_or_null(
943 State.Env.getStorageLocation(*Expr->getArg(0)));
945}
946
952 State.Lattice.clearConstMethodReturnValues(*RecordLoc);
953 State.Lattice.clearConstMethodReturnStorageLocations(*RecordLoc);
954 }
957}
958
965
966static void
970 auto *RecordLoc = cast_or_null(
971 State.Env.getStorageLocation(*Expr->getArg(0)));
973}
974
978 State.Env.setValue(
980 State.Env.getBoolLiteralValue(true));
981}
982
986 BoolValue &OkMatcherVal = State.Env.getBoolLiteralValue(true);
987 State.Env.setValue(locForOkMatcher(State.Env.getResultObjectLocation(*Expr)),
988 OkMatcherVal);
989}
990
995 auto &Loc = State.Env.getResultObjectLocation(*Expr->getArg(0));
998 if (OkMatcherVal == nullptr)
999 return;
1000 State.Env.setValue(
1002 *OkMatcherVal);
1003}
1004
1005static void
1008 bool IsStatusOr) {
1010 if (Loc == nullptr)
1011 return;
1012
1014 if (ObjectLoc == nullptr)
1015 return;
1016
1018 BoolValue *OkPredicateVal = State.Env.get<BoolValue>(OkPredicateLoc);
1019 if (OkPredicateVal == nullptr)
1020 return;
1021
1022 if (IsStatusOr)
1024 auto &StatusOk = valForOk(*ObjectLoc, State.Env);
1025
1026 auto &A = State.Env.arena();
1027 auto &Res = State.Env.makeAtomicBoolValue();
1028 State.Env.assume(
1029 A.makeImplies(OkPredicateVal->formula(),
1030 A.makeEquals(StatusOk.formula(), Res.formula())));
1031 State.Env.setValue(locForOk(State.Env.getResultObjectLocation(*Expr)), Res);
1032}
1033
1034static void
1038 assert(Expr->getNumArgs() > 0);
1039
1040 auto *StatusAdaptorLoc = State.Env.get<StorageLocation>(*Expr->getArg(0));
1041 if (StatusAdaptorLoc == nullptr)
1042 return;
1044 if (OkVal == nullptr)
1045 return;
1046 State.Env.setValue(locForOk(State.Env.getResultObjectLocation(*Expr)),
1047 *OkVal);
1048}
1049
1050static void
1056 return;
1058 if (OkVal == nullptr)
1059 return;
1060 auto &A = State.Env.arena();
1061 auto &Res = State.Env.makeAtomicBoolValue();
1062 State.Env.assume(A.makeEquals(OkVal->formula(), Res.formula()));
1063 State.Env.setValue(*Expr, Res);
1064}
1065
1070
1071 if (StatusOrLoc && State.Env.getStorageLocation(*Expr) == nullptr)
1072 State.Env.setStorageLocation(*Expr,
1073 StatusOrLoc->getSyntheticField("value"));
1074}
1075
1080 if (!StatusOrLoc)
1081 return;
1083 StatusOrLoc->getSyntheticField("value")));
1084}
1085
1090
1091 if (StatusOrLoc && State.Env.getStorageLocation(*Expr) == nullptr)
1092 State.Env.setStorageLocation(*Expr,
1093 StatusOrLoc->getSyntheticField("value"));
1094}
1095
1100 dyn_cast_or_null(State.Env.getValue(*Expr));
1101 if (!PointerVal) {
1103 State.Env.setValue(*Expr, *PointerVal);
1104 }
1105
1107 dyn_cast_or_null(&PointerVal->getPointeeLoc());
1111}
1112
1117 dyn_cast_or_null(State.Env.getValue(*Expr));
1118 if (!PointerVal) {
1120 State.Env.setValue(*Expr, *PointerVal);
1121 }
1122
1124 dyn_cast_or_null(&PointerVal->getPointeeLoc());
1128}
1129
1133 return dyn_cast_or_null(Env.getStorageLocation(E));
1134 if (auto *PointerVal = dyn_cast_or_null(Env.getValue(E)))
1135 return dyn_cast_or_null(
1136 &PointerVal->getPointeeLoc());
1137 return nullptr;
1138}
1139
1144 return std::move(Builder)
1153 .CaseOfCFGStmt(
1158 true);
1159 })
1160 .CaseOfCFGStmt(
1165 false);
1166 })
1167 .CaseOfCFGStmt(
1180 .CaseOfCFGStmt(
1185 false);
1186 })
1187 .CaseOfCFGStmt(
1192 true);
1193 })
1194 .CaseOfCFGStmt(
1199 false);
1200 })
1201 .CaseOfCFGStmt(
1206 true);
1207 })
1230
1231
1232
1233 .CaseOfCFGStmt(
1241 })
1242 .CaseOfCFGStmt(
1250 })
1251 .CaseOfCFGStmt(
1258 })
1259 .CaseOfCFGStmt(
1266 })
1267
1273 .CaseOfCFGStmt(
1279
1284
1285
1291 })
1296
1297
1298
1299
1300
1301
1306 .CaseOfCFGStmt(
1309 .Build();
1310}
1311
1319
1326 Env.getDataflowAnalysisContext().setSyntheticFieldCallback(
1327 [StatusType](QualType Ty) -> llvm::StringMap {
1329 if (RD == nullptr)
1330 return {};
1331
1333 !Fields.empty())
1334 return Fields;
1335 return {};
1336 });
1337}
1338
1344
1345}
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
llvm::MachO::RecordLoc RecordLoc
Defines the clang::SourceLocation class and associated facilities.
C Language Family Type Representation.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const SmallVectorImpl< Type * > & getTypes() const
A builtin binary operation expression such as "x + y" or "x <= y".
Represents a top-level expression in a basic block.
Represents a call to a C++ constructor.
Represents a call to a member function that may be written either with member call syntax (e....
SourceLocation getExprLoc() const LLVM_READONLY
A call to an overloaded operator written using operator syntax.
Represents a C++ struct/union/class.
bool hasDefinition() const
bool isDerivedFrom(const CXXRecordDecl *Base) const
Determine whether this class is derived from the class Base.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
Represents a class template specialization, which refers to a class template with a given set of temp...
const TemplateArgumentList & getTemplateArgs() const
Retrieve the template arguments of the class template specialization.
DeclContext * getParent()
getParent - Returns the containing DeclContext.
ASTContext & getASTContext() const LLVM_READONLY
This represents one expression.
Represents a function declaration or definition.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
Represent a C++ namespace.
A (possibly-)qualified type.
const TemplateArgument & get(unsigned Idx) const
Retrieve the template argument at a given index.
QualType getAsType() const
Retrieve the type for a type template argument.
The base class of the type hierarchy.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isPointerType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
const Formula & formula() const
Collects cases of a "match switch": a collection of matchers paired with callbacks,...
ASTContext & getASTContext() final
DataflowAnalysis(ASTContext &Context)
CachedConstAccessorsLattice< NoopLattice > Lattice
Holds the state of the program (store and heap) at a given program point.
StorageLocation * getStorageLocation(const ValueDecl &D) const
Returns the storage location assigned to D in the environment, or null if D isn't assigned a storage ...
BoolValue & makeAtomicBoolValue() const
Returns an atomic boolean value.
bool proves(const Formula &) const
Returns true if the formula is always true when this point is reached.
Value * getValue(const StorageLocation &Loc) const
Returns the value assigned to Loc in the environment or null if Loc isn't assigned a value in the env...
void assume(const Formula &)
Record a fact that must be true if this point in the program is reached.
void setValue(const StorageLocation &Loc, Value &Val)
Assigns Val as the value of Loc in the environment.
std::enable_if_t< std::is_base_of_v< StorageLocation, T >, T * > get(const ValueDecl &D) const
Returns the result of casting getStorageLocation(...) to a subclass of StorageLocation (using cast_or...
Models a symbolic pointer. Specifically, any value of type T*.
StorageLocation & getPointeeLoc() const
A storage location for a record (struct, class, or union).
StorageLocation & getSyntheticField(llvm::StringRef Name) const
Returns the storage location for the synthetic field Name.
Base class for elements of the local variable store and of the heap.
Base class for all values computed by abstract interpretation.
UncheckedStatusOrAccessDiagnoser(UncheckedStatusOrAccessModelOptions Options={})
Definition UncheckedStatusOrAccessModel.cpp:398
llvm::SmallVector< SourceLocation > operator()(const CFGElement &Elt, ASTContext &Ctx, const TransferStateForDiagnostics< UncheckedStatusOrAccessModel::Lattice > &State)
Definition UncheckedStatusOrAccessModel.cpp:402
UncheckedStatusOrAccessModel(ASTContext &Ctx, Environment &Env)
Definition UncheckedStatusOrAccessModel.cpp:1320
void transfer(const CFGElement &Elt, Lattice &L, Environment &Env)
Definition UncheckedStatusOrAccessModel.cpp:1339
internal::Matcher< QualType > TypeMatcher
const internal::VariadicDynCastAllOfMatcher< Stmt, DeclRefExpr > declRefExpr
Matches expressions that refer to declarations.
const internal::VariadicOperatorMatcherFunc< 1, 1 > unless
Matches if the provided matcher does not match.
internal::Matcher< Decl > DeclarationMatcher
Types of matchers for the top-level classes in the AST class hierarchy.
const internal::VariadicDynCastAllOfMatcher< Stmt, ImplicitCastExpr > implicitCastExpr
Matches the implicit cast nodes of Clang's AST.
const internal::VariadicDynCastAllOfMatcher< Stmt, CallExpr > callExpr
Matches call expressions.
const internal::VariadicDynCastAllOfMatcher< Decl, NamedDecl > namedDecl
Matches a declaration of anything that could have a name.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicFunction< internal::Matcher< NamedDecl >, StringRef, internal::hasAnyNameFunc > hasAnyName
Matches NamedDecl nodes that have any of the specified names.
internal::Matcher< Stmt > StatementMatcher
const internal::VariadicDynCastAllOfMatcher< Decl, EnumConstantDecl > enumConstantDecl
Matches enum constants.
const internal::VariadicDynCastAllOfMatcher< Stmt, BinaryOperator > binaryOperator
Matches binary operator expressions.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXConstructExpr > cxxConstructExpr
Matches constructor call expressions (including implicit ones).
const internal::VariadicDynCastAllOfMatcher< Decl, ClassTemplateSpecializationDecl > classTemplateSpecializationDecl
Matches C++ class template specializations.
const internal::VariadicDynCastAllOfMatcher< Decl, FunctionDecl > functionDecl
Matches function declarations.
const AstTypeMatcher< RecordType > recordType
const internal::VariadicDynCastAllOfMatcher< Decl, CXXRecordDecl > cxxRecordDecl
Matches C++ class declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, RecordDecl > recordDecl
Matches class, struct, and union declarations.
internal::PolymorphicMatcher< internal::HasDeclarationMatcher, void(internal::HasDeclarationSupportedTypes), internal::Matcher< Decl > > hasDeclaration(const internal::Matcher< Decl > &InnerMatcher)
Matches a node if the declaration associated with that node matches the given matcher.
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
const internal::VariadicOperatorMatcherFunc< 2, std::numeric_limits< unsigned >::max()> anyOf
Matches if any of the given matchers matches.
const internal::VariadicAllOfMatcher< QualType > qualType
Matches QualTypes in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXThisExpr > cxxThisExpr
Matches implicit and explicit this expressions.
static void transferLoggingCheckEqImpl(const CallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:810
static void transferStatusOrReturningCall(const CallExpr *Expr, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:867
static void transferValueAssignmentCall(const CXXOperatorCallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:757
TransferState< UncheckedStatusOrAccessModel::Lattice > LatticeTransferState
static ClassTemplateSpecializationDecl * getStatusOrBaseClass(const QualType &Ty)
Definition UncheckedStatusOrAccessModel.cpp:79
static bool isStatusOrOperatorBaseType(QualType Type)
Definition UncheckedStatusOrAccessModel.cpp:65
static void transferConstStatusOrAccessorMemberCall(const CXXMemberCallExpr *Expr, const MatchFinder::MatchResult &Result, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:917
static void transferValueCall(const CXXMemberCallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:1086
static StorageLocation & locForOkMatcher(RecordStorageLocation &StatusLoc)
Definition UncheckedStatusOrAccessModel.cpp:510
static auto isStatusMemberCallWithName(llvm::StringRef member_name)
Definition UncheckedStatusOrAccessModel.cpp:105
static auto buildDiagnoseMatchSwitch(const UncheckedStatusOrAccessModelOptions &Options)
Definition UncheckedStatusOrAccessModel.cpp:369
static auto isStatusOrValueConstructor()
Definition UncheckedStatusOrAccessModel.cpp:190
static auto isConstStatusOrAccessorMemberCall()
Definition UncheckedStatusOrAccessModel.cpp:241
static auto isComparisonOperatorCall(llvm::StringRef operator_name)
Definition UncheckedStatusOrAccessModel.cpp:141
static void transferAssertionResultConstructFromBoolCall(const CXXConstructExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:1035
RecordStorageLocation & locForStatus(RecordStorageLocation &StatusOrLoc)
Definition UncheckedStatusOrAccessModel.cpp:493
static auto isLoggingCheckEqImpl()
Definition UncheckedStatusOrAccessModel.cpp:216
static void transferNotOkStatusCall(const CallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:736
static BoolValue * evaluateStatusEquality(RecordStorageLocation &LhsStatusLoc, RecordStorageLocation &RhsStatusLoc, Environment &Env)
Definition UncheckedStatusOrAccessModel.cpp:581
static void transferStatusConstructor(const CXXConstructExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:788
static BoolValue * evaluateStatusOrEquality(RecordStorageLocation &LhsStatusOrLoc, RecordStorageLocation &RhsStatusOrLoc, Environment &Env)
Definition UncheckedStatusOrAccessModel.cpp:610
static void transferMakePredicateFormatterFromIsOkMatcherCall(const CallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:975
static auto isNonConstMemberOperatorCall()
Definition UncheckedStatusOrAccessModel.cpp:274
static bool isPredicateFormatterFromMatcherType(QualType Type)
Definition UncheckedStatusOrAccessModel.cpp:457
static auto isStatusOrOperatorCallWithName(llvm::StringRef operator_name)
Definition UncheckedStatusOrAccessModel.cpp:121
clang::ast_matchers::TypeMatcher statusType()
Definition UncheckedStatusOrAccessModel.cpp:444
static void transferNonConstMemberOperatorCall(const CXXOperatorCallExpr *Expr, const MatchFinder::MatchResult &Result, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:967
static auto isAssertionResultOperatorBoolCall()
Definition UncheckedStatusOrAccessModel.cpp:334
static void transferValueConstructor(const CXXConstructExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:770
static auto isOkStatusCall()
Definition UncheckedStatusOrAccessModel.cpp:149
static auto isStatusOrPtrReturningCall()
Definition UncheckedStatusOrAccessModel.cpp:355
static void transferComparisonOperator(const CXXOperatorCallExpr *Expr, LatticeTransferState &State, bool IsNegative)
Definition UncheckedStatusOrAccessModel.cpp:662
static void transferConstStatusOrPointerAccessorMemberCall(const CXXMemberCallExpr *Expr, const MatchFinder::MatchResult &Result, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:932
clang::ast_matchers::DeclarationMatcher statusOrClass()
Definition UncheckedStatusOrAccessModel.cpp:421
static auto isConstStatusOrAccessorMemberOperatorCall()
Definition UncheckedStatusOrAccessModel.cpp:248
static void transferOkStatusCall(const CallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:728
static auto isPointerComparisonOperatorCall(std::string operator_name)
Definition UncheckedStatusOrAccessModel.cpp:167
clang::ast_matchers::TypeMatcher statusOrType()
Definition UncheckedStatusOrAccessModel.cpp:439
static auto isStatusConstructor()
Definition UncheckedStatusOrAccessModel.cpp:206
static bool isSafeUnwrap(RecordStorageLocation *StatusOrLoc, const Environment &Env)
Definition UncheckedStatusOrAccessModel.cpp:69
static void transferPointerComparisonOperator(const BinaryOperator *Expr, LatticeTransferState &State, bool IsNegative)
Definition UncheckedStatusOrAccessModel.cpp:714
static auto valueCall()
Definition UncheckedStatusOrAccessModel.cpp:129
static void transferNonConstMemberCall(const CXXMemberCallExpr *Expr, const MatchFinder::MatchResult &Result, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:959
static void transferStatusOrOkCall(const CXXMemberCallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:514
static bool namespaceEquals(const NamespaceDecl *NS, clang::ArrayRef< clang::StringRef > NamespaceNames)
Definition UncheckedStatusOrAccessModel.cpp:43
static bool isTypeNamed(QualType Type, clang::ArrayRef< clang::StringRef > NS, StringRef Name)
Definition UncheckedStatusOrAccessModel.cpp:54
static void transferStatusOrConstructor(const CXXConstructExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:778
static void transferLoggingGetReferenceableValueCall(const CallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:797
static auto valueOperatorCall()
Definition UncheckedStatusOrAccessModel.cpp:135
clang::ast_matchers::DeclarationMatcher statusClass()
Definition UncheckedStatusOrAccessModel.cpp:428
static auto ofClassStatus()
Definition UncheckedStatusOrAccessModel.cpp:100
static RecordStorageLocation * getSmartPtrLikeStorageLocation(const Expr &E, const Environment &Env)
Definition UncheckedStatusOrAccessModel.cpp:1131
static bool isStatusIsMatcherType(QualType Type)
Definition UncheckedStatusOrAccessModel.cpp:466
static void handleNonConstMemberCall(const CallExpr *Expr, RecordStorageLocation *RecordLoc, const MatchFinder::MatchResult &Result, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:947
BoolValue & initializeStatusOr(RecordStorageLocation &StatusOrLoc, Environment &Env)
Definition UncheckedStatusOrAccessModel.cpp:416
static void transferAsStatusCallWithStatusOr(const CallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:841
static auto possiblyReferencedStatusOrType()
Definition UncheckedStatusOrAccessModel.cpp:236
static auto isLoggingGetReferenceableValueCall()
Definition UncheckedStatusOrAccessModel.cpp:210
QualType findStatusType(const ASTContext &Ctx)
Definition UncheckedStatusOrAccessModel.cpp:1312
BoolValue & initializeStatus(RecordStorageLocation &StatusLoc, Environment &Env)
Definition UncheckedStatusOrAccessModel.cpp:409
static void transferDerefCall(const CXXOperatorCallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:1066
static void transferPointerToBoolean(const ImplicitCastExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:859
llvm::StringMap< QualType > getSyntheticFields(QualType Ty, QualType StatusType, const CXXRecordDecl &RD)
Definition UncheckedStatusOrAccessModel.cpp:477
StorageLocation & locForOk(RecordStorageLocation &StatusLoc)
Definition UncheckedStatusOrAccessModel.cpp:497
static void transferStatusIsOkMatcherCall(const CallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:983
static auto isAsStatusCallWithStatusOr()
Definition UncheckedStatusOrAccessModel.cpp:229
static auto isMakePredicateFormatterFromIsOkMatcherCall()
Definition UncheckedStatusOrAccessModel.cpp:279
static auto isNonConstMemberCall()
Definition UncheckedStatusOrAccessModel.cpp:269
static void transferConstStatusOrPointerAccessorMemberOperatorCall(const CXXOperatorCallExpr *Expr, const MatchFinder::MatchResult &Result, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:939
static void handleConstStatusOrPointerAccessorMemberCall(const CallExpr *Expr, RecordStorageLocation *RecordLoc, const MatchFinder::MatchResult &Result, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:906
static auto isAssertionResultConstructFromBoolCall()
Definition UncheckedStatusOrAccessModel.cpp:342
static auto isStatusOrMemberCallWithName(llvm::StringRef member_name)
Definition UncheckedStatusOrAccessModel.cpp:112
static auto isConstStatusOrPointerAccessorMemberOperatorCall()
Definition UncheckedStatusOrAccessModel.cpp:262
static BoolValue * evaluateEquality(const Expr *LhsExpr, const Expr *RhsExpr, Environment &Env)
Definition UncheckedStatusOrAccessModel.cpp:633
static auto isConstStatusOrPointerAccessorMemberCall()
Definition UncheckedStatusOrAccessModel.cpp:255
static void transferStatusCall(const CXXMemberCallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:526
static void transferStatusOkCall(const CXXMemberCallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:545
static void transferPredicateFormatterMatcherCall(const CXXOperatorCallExpr *Expr, LatticeTransferState &State, bool IsStatusOr)
Definition UncheckedStatusOrAccessModel.cpp:1006
static void transferAssertionResultOperatorBoolCall(const CXXMemberCallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:1051
static StorageLocation & locForOkPredicate(RecordStorageLocation &StatusLoc)
Definition UncheckedStatusOrAccessModel.cpp:506
static void transferMakePredicateFormatterFromStatusIsMatcherCall(const CallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:991
static void transferEmplaceCall(const CXXMemberCallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:745
static auto isPredicateFormatterFromStatusMatcherCall()
Definition UncheckedStatusOrAccessModel.cpp:316
static auto isStatusOrValueAssignmentCall()
Definition UncheckedStatusOrAccessModel.cpp:180
static void transferAsStatusCallWithStatus(const CallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:825
static void transferStatusOrPtrReturningCall(const CallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:1096
static auto isStatusOrConstructor()
Definition UncheckedStatusOrAccessModel.cpp:201
static BoolValue * evaluatePointerEquality(const Expr *LhsExpr, const Expr *RhsExpr, Environment &Env)
Definition UncheckedStatusOrAccessModel.cpp:683
static QualType getStatusOrValueType(ClassTemplateSpecializationDecl *TRD)
Definition UncheckedStatusOrAccessModel.cpp:96
static RecordStorageLocation * getPointeeLocation(const Expr &Expr, Environment &Env)
Definition UncheckedStatusOrAccessModel.cpp:676
static void transferArrowCall(const CXXOperatorCallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:1076
static void transferStatusPtrReturningCall(const CallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:1113
static bool isAssertionResultType(QualType Type)
Definition UncheckedStatusOrAccessModel.cpp:462
static auto isAsStatusCallWithStatus()
Definition UncheckedStatusOrAccessModel.cpp:222
BoolValue & valForOk(RecordStorageLocation &StatusLoc, Environment &Env)
Definition UncheckedStatusOrAccessModel.cpp:501
bool isStatusOrType(QualType Type)
Definition UncheckedStatusOrAccessModel.cpp:449
static auto isNotOkStatusCall()
Definition UncheckedStatusOrAccessModel.cpp:154
static auto isStatusPtrReturningCall()
Definition UncheckedStatusOrAccessModel.cpp:361
static auto isStatusIsOkMatcherCall()
Definition UncheckedStatusOrAccessModel.cpp:292
static void transferConstStatusOrAccessorMemberOperatorCall(const CXXOperatorCallExpr *Expr, const MatchFinder::MatchResult &Result, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:924
static auto isPredicateFormatterFromStatusOrMatcherCall()
Definition UncheckedStatusOrAccessModel.cpp:325
static void transferStatusUpdateCall(const CXXMemberCallExpr *Expr, const MatchFinder::MatchResult &, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:557
static auto isStatusOrReturningCall()
Definition UncheckedStatusOrAccessModel.cpp:349
static bool doHandleConstStatusOrAccessorMemberCall(const CallExpr *Expr, RecordStorageLocation *RecordLoc, const MatchFinder::MatchResult &Result, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:877
static auto isMakePredicateFormatterFromStatusIsMatcherCall()
Definition UncheckedStatusOrAccessModel.cpp:302
CFGMatchSwitch< LatticeTransferState > buildTransferMatchSwitch(ASTContext &Ctx, CFGMatchSwitchBuilder< LatticeTransferState > Builder)
Definition UncheckedStatusOrAccessModel.cpp:1141
static void handleConstStatusOrAccessorMemberCall(const CallExpr *Expr, RecordStorageLocation *RecordLoc, const MatchFinder::MatchResult &Result, LatticeTransferState &State)
Definition UncheckedStatusOrAccessModel.cpp:900
bool isStatusType(QualType Type)
Definition UncheckedStatusOrAccessModel.cpp:453
clang::ast_matchers::DeclarationMatcher statusOrOperatorBaseClass()
Definition UncheckedStatusOrAccessModel.cpp:433
ast_matchers::StatementMatcher isSmartPointerLikeValueMethodCall(clang::StringRef MethodName="value")
void transferSmartPointerLikeCachedDeref(const CallExpr *DerefExpr, RecordStorageLocation *SmartPointerLoc, TransferState< LatticeT > &State, llvm::function_ref< void(StorageLocation &)> InitializeLoc)
A transfer function for operator* (and value) calls that can be cached.
ast_matchers::StatementMatcher isPointerLikeOperatorStar()
Matchers: For now, these match on any class with an operator* or operator-> where the return types ha...
void copyRecord(RecordStorageLocation &Src, RecordStorageLocation &Dst, Environment &Env, QualType TypeToCopy=QualType())
Copies a record (struct, class, or union) from Src to Dst.
void transferSmartPointerLikeCachedGet(const CallExpr *GetExpr, RecordStorageLocation *SmartPointerLoc, TransferState< LatticeT > &State, llvm::function_ref< void(StorageLocation &)> InitializeLoc)
A transfer function for operator-> (and get) calls that can be cached.
internal::Matcher< NamedDecl > hasName(StringRef Name)
Matches NamedDecl nodes that have the specified name.
std::function< Result(const CFGElement &, ASTContext &, State &)> CFGMatchSwitch
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXMemberCallExpr > cxxMemberCallExpr
Matches member call expressions.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXOperatorCallExpr > cxxOperatorCallExpr
Matches overloaded operator calls.
const AstTypeMatcher< PointerType > pointerType
internal::PolymorphicMatcher< internal::HasOverloadedOperatorNameMatcher, AST_POLYMORPHIC_SUPPORTED_TYPES(CXXOperatorCallExpr, FunctionDecl), std::vector< std::string > > hasOverloadedOperatorName(StringRef Name)
Matches overloaded operator names.
RecordStorageLocation * getImplicitObjectLocation(const CXXMemberCallExpr &MCE, const Environment &Env)
Returns the storage location for the implicit object of a CXXMemberCallExpr, or null if none is defin...
const internal::VariadicDynCastAllOfMatcher< Decl, CXXMethodDecl > cxxMethodDecl
Matches method declarations.
ast_matchers::StatementMatcher isSmartPointerLikeGetMethodCall(clang::StringRef MethodName="get")
ast_matchers::StatementMatcher isPointerLikeOperatorArrow()
const AstTypeMatcher< ReferenceType > referenceType
@ Result
The result type of a method or function.
U cast(CodeGen::Address addr)
Contains all information for a given match.
A read-only version of TransferState.
Contains all information for a given match.