xazax.hun added inline comments.

================
Comment at: 
clang/include/clang/Analysis/FlowSensitive/DataflowAnalysisContext.h:120
 
-  // FIXME: Add `StorageLocation` for `this`.
+  StorageLocation *ThisPointeeLoc = nullptr;
 
----------------
It feels a bit wrong to have a separate `ThisPointeeLoc` here. But as far as I 
understand, this is an artifact of the AST representation we have. I think a 
superior AST representation would have an implicit `ParmVarDecl` to represent 
`this`, so we would not need to do any special handling at all, the general 
code path would do the right thing. I think the C++ language, with the 
`deducing this` started its approach in this direction officially. I really 
hope someone will have the time to fix all the mess and get rid of all the 
unnecessary corner cases in the foreseeable future :) 


================
Comment at: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp:52
+      setStorageLocation(*ParamDecl, ParamLoc);
+      initValueInStorageLocation(ParamLoc, ParamDecl->getType());
+    }
----------------
There might be an optimization opportunity for `initValueInStorageLocation`. If 
we initialize a class or struct, we will end up create locations for all of the 
fields recursively (unless self-referential) right? Actually, in many of the 
codebases we cannot even access many of those fields because they might be 
private/protected etc. Unfortunately, it might not be easy to query whether a 
field is accessible from this method, but I wonder if it is worth a TODO 
somewhere.


================
Comment at: clang/lib/Analysis/FlowSensitive/Transfer.cpp:131
+
+    auto &Loc = Env.createStorageLocation(*S);
+    Env.setStorageLocation(*S, Loc);
----------------
Nit: I got confused for a second what will happen in a loop. I wonder if 
`createStorageLocation` is better renamed to `createOrGetStorageLocation` to 
express the fact it will not always create a new location. But I don't have 
strong feelings about this, also feel free to defer to a later PR.


================
Comment at: clang/lib/Analysis/FlowSensitive/Transfer.cpp:141-142
+
+    if (Member->isFunctionOrFunctionTemplate())
+      return;
+
----------------
I wonder if we also want to create a non-null pointer value for these in the 
future so we can evaluate certain if statements. 


================
Comment at: clang/unittests/Analysis/FlowSensitive/TransferTest.cpp:813
+
+    void target(A &Foo) {
+      (void)0;
----------------
I wonder if we can make the tests a bit more concise by merging some of them. 
E.g. we could have a single test with both a pointer, a reference, and a value 
param. Although I understand that some people like to keep most tests minimal, 
so feel free to ignore this.


================
Comment at: clang/unittests/Analysis/FlowSensitive/TransferTest.cpp:1062
+    class A {
+      int Bar;
+
----------------
I'd love to see a test with multiple fields and a nested struct.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D117012

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

Reply via email to