BlockToOutputState = dataflow::runDataflowAnalysis(
*Context, Analysis, Env,
[&ASTCtx, &Diagnoser, &Diagnostics](
- const Stmt *Stmt,
+ const CFGStmt &Stmt,
const DataflowAnalysisState<UncheckedOptionalAccessModel::Lattice>
&State) mutable {
- auto StmtDiagnostics = Diagnoser.diagnose(ASTCtx, Stmt, State.Env);
+ auto StmtDiagnostics =
+ Diagnoser.diagnose(ASTCtx, Stmt.getStmt(), State.Env);
llvm::move(StmtDiagnostics, std::back_inserter(Diagnostics));
});
if (!BlockToOutputState)
runDataflowAnalysis(
const ControlFlowContext &CFCtx, AnalysisT &Analysis,
const Environment &InitEnv,
- std::function<void(const Stmt *, const DataflowAnalysisState<
- typename AnalysisT::Lattice> &)>
+ std::function<void(const CFGStmt &, const DataflowAnalysisState<
+ typename AnalysisT::Lattice> &)>
PostVisitStmt = nullptr) {
- std::function<void(const Stmt *, const TypeErasedDataflowAnalysisState &)>
+ std::function<void(const CFGStmt &, const TypeErasedDataflowAnalysisState &)>
PostVisitStmtClosure = nullptr;
if (PostVisitStmt != nullptr) {
PostVisitStmtClosure = [&PostVisitStmt](
- const Stmt *Stmt,
+ const CFGStmt &Stmt,
const TypeErasedDataflowAnalysisState &State) {
auto *Lattice =
llvm::any_cast<typename AnalysisT::Lattice>(&State.Lattice.Value);
runTypeErasedDataflowAnalysis(
const ControlFlowContext &CFCtx, TypeErasedDataflowAnalysis &Analysis,
const Environment &InitEnv,
- std::function<void(const Stmt *, const TypeErasedDataflowAnalysisState &)>
+ std::function<void(const CFGStmt &,
+ const TypeErasedDataflowAnalysisState &)>
PostVisitStmt = nullptr);
} // namespace dataflow
runTypeErasedDataflowAnalysis(
const ControlFlowContext &CFCtx, TypeErasedDataflowAnalysis &Analysis,
const Environment &InitEnv,
- std::function<void(const Stmt *, const TypeErasedDataflowAnalysisState &)>
+ std::function<void(const CFGStmt &,
+ const TypeErasedDataflowAnalysisState &)>
PostVisitStmt) {
PostOrderCFGView POV(&CFCtx.getCFG());
ForwardDataflowWorklist Worklist(CFCtx.getCFG(), &POV);
// Skip blocks that were not evaluated.
if (!BlockStates[Block->getBlockID()])
continue;
- transferBlock(
- CFCtx, BlockStates, *Block, InitEnv, Analysis,
- [&PostVisitStmt](const clang::CFGStmt &Stmt,
- const TypeErasedDataflowAnalysisState &State) {
- PostVisitStmt(Stmt.getStmt(), State);
- });
+
+ transferBlock(CFCtx, BlockStates, *Block, InitEnv, Analysis,
+ PostVisitStmt);
}
}
llvm::StringRef Code,
ast_matchers::internal::Matcher<FunctionDecl> TargetFuncMatcher,
std::function<AnalysisT(ASTContext &, Environment &)> MakeAnalysis,
- std::function<void(ASTContext &, const Stmt *,
+ std::function<void(ASTContext &, const CFGStmt &,
const TypeErasedDataflowAnalysisState &)>
PostVisitStmt,
std::function<void(AnalysisData)> VerifyResults, ArrayRef<std::string> Args,
Environment Env(DACtx, *F);
auto Analysis = MakeAnalysis(Context, Env);
- std::function<void(const Stmt *, const TypeErasedDataflowAnalysisState &)>
+ std::function<void(const CFGStmt &, const TypeErasedDataflowAnalysisState &)>
PostVisitStmtClosure = nullptr;
if (PostVisitStmt != nullptr) {
PostVisitStmtClosure = [&PostVisitStmt, &Context](
- const Stmt *Stmt,
+ const CFGStmt &Stmt,
const TypeErasedDataflowAnalysisState &State) {
PostVisitStmt(Context, Stmt, State);
};
return UncheckedOptionalAccessModel(Ctx, Options);
},
[&Diagnostics, Diagnoser = UncheckedOptionalAccessDiagnoser(Options)](
- ASTContext &Ctx, const Stmt *Stmt,
+ ASTContext &Ctx, const CFGStmt &Stmt,
const TypeErasedDataflowAnalysisState &State) mutable {
- auto StmtDiagnostics = Diagnoser.diagnose(Ctx, Stmt, State.Env);
+ auto StmtDiagnostics =
+ Diagnoser.diagnose(Ctx, Stmt.getStmt(), State.Env);
llvm::move(StmtDiagnostics, std::back_inserter(Diagnostics));
},
[&Diagnostics](AnalysisData AnalysisData) {