@@ -150,6 +150,24 @@ static auto isComparisonOperatorCall(llvm::StringRef operator_name) {
150150 hasArgument (1 , anyOf (hasType (statusType ()), hasType (statusOrType ()))));
151151}
152152
153+ static auto isOkStatusCall () {
154+ using namespace ::clang::ast_matchers; // NOLINT: Too many names
155+ return callExpr (callee (functionDecl (hasName (" ::absl::OkStatus" ))));
156+ }
157+
158+ static auto isNotOkStatusCall () {
159+ using namespace ::clang::ast_matchers; // NOLINT: Too many names
160+ return callExpr (callee (functionDecl (hasAnyName (
161+ " ::absl::AbortedError" , " ::absl::AlreadyExistsError" ,
162+ " ::absl::CancelledError" , " ::absl::DataLossError" ,
163+ " ::absl::DeadlineExceededError" , " ::absl::FailedPreconditionError" ,
164+ " ::absl::InternalError" , " ::absl::InvalidArgumentError" ,
165+ " ::absl::NotFoundError" , " ::absl::OutOfRangeError" ,
166+ " ::absl::PermissionDeniedError" , " ::absl::ResourceExhaustedError" ,
167+ " ::absl::UnauthenticatedError" , " ::absl::UnavailableError" ,
168+ " ::absl::UnimplementedError" , " ::absl::UnknownError" ))));
169+ }
170+
153171static auto
154172buildDiagnoseMatchSwitch (const UncheckedStatusOrAccessModelOptions &Options) {
155173 return CFGMatchSwitchBuilder<const Environment,
@@ -420,6 +438,23 @@ static void transferComparisonOperator(const CXXOperatorCallExpr *Expr,
420438 State.Env .setValue (*Expr, *LhsAndRhsVal);
421439}
422440
441+ static void transferOkStatusCall (const CallExpr *Expr,
442+ const MatchFinder::MatchResult &,
443+ LatticeTransferState &State) {
444+ auto &OkVal =
445+ initializeStatus (State.Env .getResultObjectLocation (*Expr), State.Env );
446+ State.Env .assume (OkVal.formula ());
447+ }
448+
449+ static void transferNotOkStatusCall (const CallExpr *Expr,
450+ const MatchFinder::MatchResult &,
451+ LatticeTransferState &State) {
452+ auto &OkVal =
453+ initializeStatus (State.Env .getResultObjectLocation (*Expr), State.Env );
454+ auto &A = State.Env .arena ();
455+ State.Env .assume (A.makeNot (OkVal.formula ()));
456+ }
457+
423458CFGMatchSwitch<LatticeTransferState>
424459buildTransferMatchSwitch (ASTContext &Ctx,
425460 CFGMatchSwitchBuilder<LatticeTransferState> Builder) {
@@ -447,6 +482,8 @@ buildTransferMatchSwitch(ASTContext &Ctx,
447482 transferComparisonOperator (Expr, State,
448483 /* IsNegative=*/ true );
449484 })
485+ .CaseOfCFGStmt <CallExpr>(isOkStatusCall (), transferOkStatusCall)
486+ .CaseOfCFGStmt <CallExpr>(isNotOkStatusCall (), transferNotOkStatusCall)
450487 .Build ();
451488}
452489
0 commit comments