From: Wei Yi Tee Date: Mon, 19 Sep 2022 18:13:50 +0000 (+0000) Subject: [clang][dataflow] Modify `transfer` in `DataflowModel` to take `CFGElement` as input... X-Git-Tag: upstream/17.0.6~33122 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=41d52c5a7f7ad1acf8e84ad6d7f04813c1a5a7ec;p=platform%2Fupstream%2Fllvm.git [clang][dataflow] Modify `transfer` in `DataflowModel` to take `CFGElement` as input instead of `Stmt`. To keep API of transfer functions consistent. The single use of this transfer function in `ChromiumCheckModel` is also updated. Reviewed By: gribozavr2, sgatev Differential Revision: https://reviews.llvm.org/D133933 --- diff --git a/clang/include/clang/Analysis/FlowSensitive/DataflowAnalysis.h b/clang/include/clang/Analysis/FlowSensitive/DataflowAnalysis.h index 098c13c..cbd20ad 100644 --- a/clang/include/clang/Analysis/FlowSensitive/DataflowAnalysis.h +++ b/clang/include/clang/Analysis/FlowSensitive/DataflowAnalysis.h @@ -193,8 +193,8 @@ runDataflowAnalysis( /// example, a model may capture a type and its related functions. class DataflowModel : public Environment::ValueModel { public: - /// Return value indicates whether the model processed the `Stmt`. - virtual bool transfer(const Stmt *Stmt, Environment &Env) = 0; + /// Return value indicates whether the model processed the `Element`. + virtual bool transfer(const CFGElement *Element, Environment &Env) = 0; }; } // namespace dataflow diff --git a/clang/include/clang/Analysis/FlowSensitive/Models/ChromiumCheckModel.h b/clang/include/clang/Analysis/FlowSensitive/Models/ChromiumCheckModel.h index 93c427b..e65f40b 100644 --- a/clang/include/clang/Analysis/FlowSensitive/Models/ChromiumCheckModel.h +++ b/clang/include/clang/Analysis/FlowSensitive/Models/ChromiumCheckModel.h @@ -26,7 +26,7 @@ namespace dataflow { class ChromiumCheckModel : public DataflowModel { public: ChromiumCheckModel() = default; - bool transfer(const Stmt *Stmt, Environment &Env) override; + bool transfer(const CFGElement *Element, Environment &Env) override; private: /// Declarations for `::logging::CheckError::.*Check`, lazily initialized. diff --git a/clang/lib/Analysis/FlowSensitive/Models/ChromiumCheckModel.cpp b/clang/lib/Analysis/FlowSensitive/Models/ChromiumCheckModel.cpp index 3910847..f457964 100644 --- a/clang/lib/Analysis/FlowSensitive/Models/ChromiumCheckModel.cpp +++ b/clang/lib/Analysis/FlowSensitive/Models/ChromiumCheckModel.cpp @@ -50,7 +50,11 @@ bool isCheckLikeMethod(llvm::SmallDenseSet &CheckDecls, return CheckDecls.contains(&D); } -bool ChromiumCheckModel::transfer(const Stmt *Stmt, Environment &Env) { +bool ChromiumCheckModel::transfer(const CFGElement *Element, Environment &Env) { + auto CS = Element->getAs(); + if (!CS) + return false; + auto Stmt = CS->getStmt(); if (const auto *Call = dyn_cast(Stmt)) { if (const auto *M = dyn_cast(Call->getDirectCallee())) { if (isCheckLikeMethod(CheckDecls, *M)) { diff --git a/clang/unittests/Analysis/FlowSensitive/ChromiumCheckModelTest.cpp b/clang/unittests/Analysis/FlowSensitive/ChromiumCheckModelTest.cpp index 5743669..1e149db 100644 --- a/clang/unittests/Analysis/FlowSensitive/ChromiumCheckModelTest.cpp +++ b/clang/unittests/Analysis/FlowSensitive/ChromiumCheckModelTest.cpp @@ -119,9 +119,7 @@ public: static NoopLattice initialElement() { return NoopLattice(); } void transfer(const CFGElement *E, NoopLattice &, Environment &Env) { - if (auto S = E->getAs()) { - M.transfer(S->getStmt(), Env); - } + M.transfer(E, Env); } private: