vsavchenko added inline comments.

================
Comment at: clang/include/clang/Analysis/Analyses/CalledOnceCheck.h:32
+/// \enum SwitchSkipped -- there is no call if none of the cases appies.
+/// \enum LoopEntered -- no call when the loop is entered.
+/// \enum LoopSkipped -- no call when the loop is not entered.
----------------
NoQ wrote:
> Hold up, how can this happen at all without path sensitivity? If the loop is 
> not entered then literally nothing happens, so there can't be a call. If 
> there's no call in either case then probably it's just "there's simply no 
> call at all"?
You can see examples in tests 😉 


================
Comment at: clang/lib/Analysis/CalledOnceCheck.cpp:541-542
+private:
+  NotCalledClarifier(const CFGBlock *Parent, const CFGBlock *SuccInQuestion)
+      : Parent(Parent), SuccInQuestion(SuccInQuestion) {}
+
----------------
NoQ wrote:
> This is one of the more subtle facilities, i really want a comment here a lot 
> more than on the `NamesCollector`. Like, which blocks do you feed into this 
> class? Do i understand correctly that `Parent` is the block at which we 
> decided to emit the warning? And `SuccInQuestion` is its successor on which 
> there was no call? Or on which there was a call? I can probably ultimately 
> figure this out if i read all the code but i would be much happier if there 
> was a comment.
These are correct questions and I will add a comment, but I want to point out 
that these questions should be asked not about a private constructor (I always 
consider those as "don't go there girlfriend!").  The only "entry point" to 
this class,`clarify`, has more reasonable parameter names.


================
Comment at: clang/lib/Analysis/CalledOnceCheck.cpp:560
+                    bool CheckConventionalParameters)
+      : FunctionCFG(FunctionCFG), AC(AC), Handler(Handler),
+        CheckConventionalParameters(CheckConventionalParameters),
----------------
NoQ wrote:
> Why not `FunctionCFG(AC->getCFG())` and omit the CFG parameter? That's the 
> same function, right?
Right, I thought about it!  It is simply how it was done in some other 
analysis-based warning


================
Comment at: clang/lib/Analysis/CalledOnceCheck.cpp:780
+    //
+    // The following algorithm has the worst case complexity of O(N + E),
+    // where N is the number of basic blocks in FunctionCFG,
----------------
NoQ wrote:
> I'm super used to `V` and `E` for Vertices and Edges in the big-O-notation 
> for graph algorithms, is it just me?
Yep, it is a rudiment of the previous version of this comment.  I'll change it!


================
Comment at: clang/lib/Analysis/CalledOnceCheck.cpp:822
+  /// calling the parameter itself, but rather uses it as the argument.
+  template <class CallLikeExpr>
+  void checkIndirectCall(const CallLikeExpr *CallOrMessage) {
----------------
NoQ wrote:
> Did you consider `AnyCall`? That's a universal wrapper for all kinds of AST 
> calls for exactly these cases. It's not super compile-time but it adds a lot 
> of convenience. (Also uh-oh, its doxygen page seems to be broken). It's ok if 
> you find it unsuitable but i kind of still want to popularize it.
It doesn't seem to have iteration over arguments.


================
Comment at: clang/lib/Analysis/CalledOnceCheck.cpp:1124
+                     (ReturnChildren &&
+                      ReturnChildren->getParent(SuspiciousStmt));
+            }
----------------
NoQ wrote:
> 
Oh, didn't notice that one!


================
Comment at: clang/lib/Analysis/CalledOnceCheck.cpp:1132
+  /// Check if parameter with the given index was ever used.
+  /// NOTE: This function checks only for escapes.
+  bool wasEverUsed(unsigned Index) const {
----------------
NoQ wrote:
> So the contract of this function is "We haven't seen any actual calls, which 
> is why we're wondering", otherwise it's not expected to do what it says it 
> does?
Right!


================
Comment at: clang/lib/Analysis/CalledOnceCheck.cpp:1247
+                               State &ToAlter) const {
+    // Even when the analyzer is technically correct, it is a widespread 
pattern
+    // not to call completion handlers in some scenarios.  These usually have
----------------
NoQ wrote:
> (:
So true 😄 


================
Comment at: clang/lib/Analysis/CalledOnceCheck.cpp:1310
+  /// a specified status for the given parameter.
+  bool isAnyOfSuccessorsHasStatus(const CFGBlock *Parent,
+                                  unsigned ParameterIndex,
----------------
NoQ wrote:
> "Successor is has status" doesn't sound right, maybe `anySuccessorHasStatus`?
Dern it! I noticed that before, but forgot to change it, thanks!


================
Comment at: clang/lib/Analysis/CalledOnceCheck.cpp:1442
+    // is intentionally not called on this path.
+    if (Cast->getType() == AC.getASTContext().VoidTy) {
+      checkEscapee(Cast->getSubExpr());
----------------
NoQ wrote:
> I feel really bad bringing this up in this context but i guess it kind of 
> makes sense to canonicalize the type first?
Will do


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D92039

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

Reply via email to