Author: Yitzhak Mandelbaum Date: 2023-07-26T17:12:29Z New Revision: e9570d1e59ba381ea55327b5cbed0b5bc05677fe
URL: https://github.com/llvm/llvm-project/commit/e9570d1e59ba381ea55327b5cbed0b5bc05677fe DIFF: https://github.com/llvm/llvm-project/commit/e9570d1e59ba381ea55327b5cbed0b5bc05677fe.diff LOG: [clang-tidy] Update unchecked-optiona-access-check to use convenience function for diagnosing `FunctionDecl`s. Also changes code in the underlying model to fit the type expected by the convenience function. Differential Revision: https://reviews.llvm.org/D156255 Added: Modified: clang-tools-extra/clang-tidy/bugprone/UncheckedOptionalAccessCheck.cpp clang/include/clang/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.h clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clang-tidy/bugprone/UncheckedOptionalAccessCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/UncheckedOptionalAccessCheck.cpp index eae955e8d47610..7c63c8441c33cc 100644 --- a/clang-tools-extra/clang-tidy/bugprone/UncheckedOptionalAccessCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/UncheckedOptionalAccessCheck.cpp @@ -8,17 +8,11 @@ #include "UncheckedOptionalAccessCheck.h" #include "clang/AST/ASTContext.h" -#include "clang/AST/DeclCXX.h" #include "clang/ASTMatchers/ASTMatchFinder.h" #include "clang/ASTMatchers/ASTMatchers.h" -#include "clang/Analysis/CFG.h" -#include "clang/Analysis/FlowSensitive/ControlFlowContext.h" -#include "clang/Analysis/FlowSensitive/DataflowAnalysisContext.h" -#include "clang/Analysis/FlowSensitive/DataflowEnvironment.h" +#include "clang/Analysis/FlowSensitive/DataflowAnalysis.h" #include "clang/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.h" -#include "clang/Analysis/FlowSensitive/WatchedLiteralsSolver.h" #include "clang/Basic/SourceLocation.h" -#include "llvm/ADT/STLExtras.h" #include "llvm/Support/Error.h" #include <memory> #include <optional> @@ -32,41 +26,6 @@ using dataflow::UncheckedOptionalAccessModelOptions; static constexpr llvm::StringLiteral FuncID("fun"); -static std::optional<std::vector<SourceLocation>> -analyzeFunction(const FunctionDecl &FuncDecl, ASTContext &ASTCtx, - UncheckedOptionalAccessModelOptions ModelOptions) { - using dataflow::ControlFlowContext; - using dataflow::DataflowAnalysisState; - using llvm::Expected; - - Expected<ControlFlowContext> Context = - ControlFlowContext::build(FuncDecl, *FuncDecl.getBody(), ASTCtx); - if (!Context) - return std::nullopt; - - dataflow::DataflowAnalysisContext AnalysisContext( - std::make_unique<dataflow::WatchedLiteralsSolver>()); - dataflow::Environment Env(AnalysisContext, FuncDecl); - UncheckedOptionalAccessModel Analysis(ASTCtx); - UncheckedOptionalAccessDiagnoser Diagnoser(ModelOptions); - std::vector<SourceLocation> Diagnostics; - Expected<std::vector<std::optional< - DataflowAnalysisState<UncheckedOptionalAccessModel::Lattice>>>> - BlockToOutputState = dataflow::runDataflowAnalysis( - *Context, Analysis, Env, - [&ASTCtx, &Diagnoser, &Diagnostics]( - const CFGElement &Elt, - const DataflowAnalysisState<UncheckedOptionalAccessModel::Lattice> - &State) mutable { - auto EltDiagnostics = Diagnoser.diagnose(ASTCtx, &Elt, State.Env); - llvm::move(EltDiagnostics, std::back_inserter(Diagnostics)); - }); - if (!BlockToOutputState) - return std::nullopt; - - return Diagnostics; -} - void UncheckedOptionalAccessCheck::registerMatchers(MatchFinder *Finder) { using namespace ast_matchers; @@ -93,10 +52,17 @@ void UncheckedOptionalAccessCheck::check( if (FuncDecl->isTemplated()) return; - if (std::optional<std::vector<SourceLocation>> Errors = - analyzeFunction(*FuncDecl, *Result.Context, ModelOptions)) - for (const SourceLocation &Loc : *Errors) + UncheckedOptionalAccessDiagnoser Diagnoser(ModelOptions); + // FIXME: Allow user to set the (defaulted) SAT iterations max for + // `diagnoseFunction` with config options. + if (llvm::Expected<std::vector<SourceLocation>> Locs = + dataflow::diagnoseFunction<UncheckedOptionalAccessModel, + SourceLocation>(*FuncDecl, *Result.Context, + Diagnoser)) + for (const SourceLocation &Loc : *Locs) diag(Loc, "unchecked access to optional value"); + else + llvm::consumeError(Locs.takeError()); } } // namespace clang::tidy::bugprone diff --git a/clang/include/clang/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.h b/clang/include/clang/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.h index 23dfdd49e94d9a..76a567f1399cd4 100644 --- a/clang/include/clang/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.h +++ b/clang/include/clang/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.h @@ -74,8 +74,11 @@ class UncheckedOptionalAccessDiagnoser { UncheckedOptionalAccessDiagnoser( UncheckedOptionalAccessModelOptions Options = {}); - std::vector<SourceLocation> diagnose(ASTContext &Ctx, const CFGElement *Elt, - const Environment &Env); + std::vector<SourceLocation> + operator()(const CFGElement &Elt, ASTContext &Ctx, + const TransferStateForDiagnostics<NoopLattice> &State) { + return DiagnoseMatchSwitch(Elt, Ctx, State.Env); + } private: CFGMatchSwitch<const Environment, std::vector<SourceLocation>> diff --git a/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp b/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp index b0a8667f3fe5be..e80eba506e5383 100644 --- a/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp +++ b/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp @@ -1048,10 +1048,5 @@ UncheckedOptionalAccessDiagnoser::UncheckedOptionalAccessDiagnoser( UncheckedOptionalAccessModelOptions Options) : DiagnoseMatchSwitch(buildDiagnoseMatchSwitch(Options)) {} -std::vector<SourceLocation> UncheckedOptionalAccessDiagnoser::diagnose( - ASTContext &Ctx, const CFGElement *Elt, const Environment &Env) { - return DiagnoseMatchSwitch(*Elt, Ctx, Env); -} - } // namespace dataflow } // namespace clang diff --git a/clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp b/clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp index 719ec271e134c4..3f17557272d034 100644 --- a/clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp +++ b/clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp @@ -1322,8 +1322,7 @@ class UncheckedOptionalAccessTest ASTContext &Ctx, const CFGElement &Elt, const TransferStateForDiagnostics<NoopLattice> &State) mutable { - auto EltDiagnostics = - Diagnoser.diagnose(Ctx, &Elt, State.Env); + auto EltDiagnostics = Diagnoser(Elt, Ctx, State); llvm::move(EltDiagnostics, std::back_inserter(Diagnostics)); }) .withASTBuildArgs( _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits