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.