samestep marked an inline comment as done.
samestep added inline comments.

================
Comment at: clang/include/clang/Analysis/FlowSensitive/Diagnosis.h:38-42
+llvm::DenseSet<Diag> diagnoseCFG(
+    const ControlFlowContext &CFCtx,
+    std::vector<llvm::Optional<TypeErasedDataflowAnalysisState>> &BlockStates,
+    const Environment &Env, TypeErasedDataflowAnalysis &Analysis,
+    Diagnosis<Lattice, llvm::DenseSet<Diag>> Diagnose) {
----------------
xazax.hun wrote:
> xazax.hun wrote:
> > I feel a bit uneasy about this API. The need of helpers in the tests is a 
> > signal that this API might not be ergonomic as is. One needs to pass a lot 
> > of stuff in, and it is really error prone. For example, the user might get 
> > confused what `Environment` to pass in. Or one might pass the wrong 
> > `Analysis` if there are multiple similar ones in scope. I wonder if there 
> > is a way to reduce the ceremony needed to get diagnostics out. How about 
> > adding an optional argument to `runDataflowAnalysis` function to collect 
> > the results? I wonder if that would be a bit cleaner. You do not need to 
> > change the return type of that function, the collector object could take a 
> > reference to the `llvm::DenseSet<Diag>` that it populates. 
> Moreover, if we pass the diagnostic function to `runDataflowAnalysis`, the 
> fact whether we collect diagnostic during the fixed-point iteration or after 
> that in a separate pass becomes an implementation detail. We can easily 
> change back and forth without affecting the callers. The current API mandates 
> an implementation approach and makes it harder to change in the future.
I think this makes a lot of sense. I agree that the current set of parameters 
is unwieldy. I hadn't thought about your point of hiding the separate pass as 
an implementation detail, but that also makes sense to me. @gribozavr2 @ymandel 
@sgatev thoughts?


================
Comment at: clang/include/clang/Analysis/FlowSensitive/Diagnosis.h:38
+template <typename Lattice, typename Diag>
+llvm::DenseSet<Diag> diagnoseCFG(
+    const ControlFlowContext &CFCtx,
----------------
gribozavr2 wrote:
> This function seems pretty general and not necessarily tied to diagnostics.
> 
> WDYT about using "visitor" in the name?
> 
> For example, "visitDataflowAnalysisResults".
> 
> The "Diagnosis" would also become "DataflowAnalysisResultVisitor".
Sure, that sounds fine to me. What do you think about @xazax.hun's suggested 
alternate API? If we go with that, would we rename it to say "visitor" 
regardless?


================
Comment at: clang/include/clang/Analysis/FlowSensitive/Diagnosis.h:42
+    const Environment &Env, TypeErasedDataflowAnalysis &Analysis,
+    Diagnosis<Lattice, llvm::DenseSet<Diag>> Diagnose) {
+  llvm::DenseSet<Diag> Diags;
----------------
gribozavr2 wrote:
> I'm leaning towards std::vector<Diag> instead of a set, to avoid requiring 
> that Diag is hashable. Users who need hash-based deduplication can easily do 
> it themselves (but why would they have duplication? we only visit each Stmt 
> once)
This makes a lot of sense, I'll make that change. Somehow along the way I 
forgot that the whole reason we even needed a set was because we were using it 
as a lattice when computing a fixpoint, but you're right that since we're 
pulling this out of the fixpoint iteration, we a vector would do fine.


================
Comment at: clang/include/clang/Analysis/FlowSensitive/Diagnosis.h:57
+  }
+  return std::move(Diags);
+}
----------------
samestep wrote:
> gribozavr2 wrote:
> > sgatev wrote:
> > > Better to remove this and rely on NRVO? 
> > > https://en.cppreference.com/w/cpp/language/copy_elision
> > https://stackoverflow.com/questions/14856344/when-should-stdmove-be-used-on-a-function-return-value
> Ah OK, I'm not a C++ expert so I wasn't sure when to write `std::move` and 
> when not to. Will do, thanks!
Thanks!


================
Comment at: clang/include/clang/Analysis/FlowSensitive/MatchSwitch.h:49
+template <typename DiagsT> struct DiagnoseState {
+  DiagnoseState(DiagsT &Diags, const Environment &Env)
+      : Diags(Diags), Env(Env) {}
----------------
gribozavr2 wrote:
> samestep wrote:
> > sgatev wrote:
> > > samestep wrote:
> > > > sgatev wrote:
> > > > > Move this to Diagnosis.h?
> > > > I'd prefer to keep it in `MatchSwitch.h` alongside `TransferState`, 
> > > > unless we plan to, e.g., move that type to `DataflowAnalysis.h`.
> > > Fair enough, but generally I see `TransferState` and `DiagnoseState` as 
> > > very specific to the dataflow analysis framework whereas 
> > > `MatchSwitchBuilder` seems to be a bit more generic so I'd consider 
> > > separating them.
> > Sure, if people think it makes sense to put those two types elsewhere then 
> > we can do that in a followup.
> For now, since there is only a single user, I'd actually prefer to move it 
> into UncheckedOptionalAccessDiagnosis itself. It is a trivial component, 
> basically a std::pair, it seems that exposing it as a public API might not be 
> that helpful.
That's also fine; I can make that change here.


================
Comment at: 
clang/include/clang/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.h:85
+private:
+  ASTContext &Context;
+  MatchSwitch<DiagnoseState<llvm::DenseSet<SourceLocation>>>
----------------
xazax.hun wrote:
> Do we expect this to modify the ASTContext? Could this be a const ref instead?
I'd guess it shouldn't; I was mostly just copying the `ASTContext &` field from 
the `DataflowAnalysis` class, which is not `const`. I can try changing it to 
`const` here, though.


================
Comment at: 
clang/include/clang/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.h:78
+public:
+  UncheckedOptionalAccessDiagnosis(
+      ASTContext &AstContext, UncheckedOptionalAccessModelOptions Options = 
{});
----------------
gribozavr2 wrote:
> "Diagnosis" sounds like the result. Should this be a "Diagnoser"?
Sure, I can change it to say "Diagnoser" instead (unless we want to just 
replace it with "Visitor").


================
Comment at: clang/unittests/Analysis/FlowSensitive/TestingSupport.h:92
     std::function<AnalysisT(ASTContext &, Environment &)> MakeAnalysis,
-    std::function<void(
-        llvm::ArrayRef<std::pair<
-            std::string, DataflowAnalysisState<typename AnalysisT::Lattice>>>,
-        ASTContext &)>
-        Expectations,
+    std::function<void(AnalysisResults)> Expectations,
     ArrayRef<std::string> Args,
----------------
gribozavr2 wrote:
> It is better to name a function with a verb. WDYT about "VerifyResults"?
> 
> If you agree, please also update the functions below.
Sounds good to me, I can do that.


================
Comment at: clang/unittests/Analysis/FlowSensitive/TestingSupport.h:190
+              });
+        }
+        Expectations(Results, AnalysisResults.Context);
----------------
gribozavr2 wrote:
> Can we use diagnoseCFG to implement the loop above?
Possibly! I'll look into it.


================
Comment at: 
clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp:1925
   //  )",
-  //      UnorderedElementsAre(Pair("check-1", "unsafe: input.cc:10:9"),
-  //                           Pair("check-2", "safe")));
+  //      "safe");
 }
----------------
gribozavr2 wrote:
> The original was unsafe, is it an intentional change?
Oh! Good catch, I didn't notice that. Will fix.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D127898/new/

https://reviews.llvm.org/D127898

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to