sgatev added a comment.

Thank you both for the reviews!



================
Comment at: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp:52
+      setStorageLocation(*ParamDecl, ParamLoc);
+      initValueInStorageLocation(ParamLoc, ParamDecl->getType());
+    }
----------------
xazax.hun wrote:
> 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.
Right. I added a FIXME in `initValueInStorageLocationUnlessSelfReferential`.


================
Comment at: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp:57
+  if (const auto *MethodDecl = dyn_cast<CXXMethodDecl>(&DeclCtx)) {
+    if (!MethodDecl->isStatic()) {
+      QualType ThisPointeeType = MethodDecl->getThisObjectType();
----------------
ymandel wrote:
> nit: invert the if and return?
I prefer to keep the block self-contained as we might end up adding code after 
the outer if statement.


================
Comment at: clang/lib/Analysis/FlowSensitive/Transfer.cpp:131
+
+    auto &Loc = Env.createStorageLocation(*S);
+    Env.setStorageLocation(*S, Loc);
----------------
xazax.hun wrote:
> 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.
Ack. I added a FIXME.


================
Comment at: clang/lib/Analysis/FlowSensitive/Transfer.cpp:141-142
+
+    if (Member->isFunctionOrFunctionTemplate())
+      return;
+
----------------
xazax.hun wrote:
> 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. 
I added a FIXME.


================
Comment at: clang/unittests/Analysis/FlowSensitive/TransferTest.cpp:813
+
+    void target(A &Foo) {
+      (void)0;
----------------
xazax.hun wrote:
> 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.
I'll keep the tests separate for now, but I'll think about how to make them 
more concise.


================
Comment at: clang/unittests/Analysis/FlowSensitive/TransferTest.cpp:919
+
+        EXPECT_EQ(Env.getValue(*BazDecl, SkipPast::None), BarVal);
+      });
----------------
ymandel wrote:
> Why EXPECT here but ASSERT (as last line) in previous tests?
My bad. I updated all tests to use ASSERT only where necessary.


================
Comment at: clang/unittests/Analysis/FlowSensitive/TransferTest.cpp:1059
+
+TEST_F(TransferTest, ClassThisMember) {
+  std::string Code = R"(
----------------
ymandel wrote:
> why test a class distinct from a struct? Is there a meaningful difference 
> between the two with regard to our model? if so, might it be worth instead 
> testing explicit public vs private?
For completeness. Changing the `isStructureOrClassType` predicate in 
`initValueInStorageLocationUnlessSelfReferential` to `isStructureType` or 
`isClassType` should make one of these tests fail. I'll address public and 
private members in a follow up.


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


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