[PATCH] D122273: [clang][dataflow] Fix handling of base-class fields

Stanislav Gatev via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Mar 31 22:42:41 PDT 2022


sgatev accepted this revision.
sgatev added inline comments.


================
Comment at: clang/include/clang/Analysis/FlowSensitive/StorageLocation.h:59-60
 /// can be traced independently by abstract interpretation. For example: a
-/// struct with public members.
+/// struct with public members. Note that the corresponding `StructValue` has a
+/// flat layout that does not contain the child locations stored here.
 class AggregateStorageLocation final : public StorageLocation {
----------------
I find this a bit confusing. `StructValue` does not contain storage locations in general. I think we should make it clear that the layout of `AggregateStorageLocation` is flat, i.e. if it's used for a `struct` or `class` type it will contain child storage locations for all accessible members of base `struct` and `class` types.


================
Comment at: clang/include/clang/Analysis/FlowSensitive/Value.h:193-194
+/// Models a value of `struct` or `class` type. Implements a flat struct layout,
+/// where the child values are directly reachable from the struct value (rather
+/// than indirectly, through `StorageLocation`s).
 class StructValue final : public Value {
----------------
I'm not sure what's meant here by indirect reachability, but I suggest documenting that a `StructValue` that models a `struct` or `class` type contains child values for all accessible members of its base `struct` and `class` types. 


================
Comment at: clang/unittests/Analysis/FlowSensitive/TransferTest.cpp:1097-1100
+        const auto *FooLoc = cast<AggregateStorageLocation>(
+            Env.getStorageLocation(*FooDecl, SkipPast::None));
+        const auto &FooVal = *cast<StructValue>(Env.getValue(*FooLoc));
+        EXPECT_THAT(FooVal.getChild(*APublicDecl), NotNull());
----------------



================
Comment at: clang/unittests/Analysis/FlowSensitive/TransferTest.cpp:1102-1111
+        // Base-class fields.
+        EXPECT_THAT(FooVal.getChild(*ADefaultDecl), IsNull());
+        EXPECT_THAT(FooVal.getChild(*APrivateDecl), IsNull());
+        EXPECT_THAT(FooVal.getChild(*AProtectedDecl), NotNull());
+        EXPECT_THAT(FooVal.getChild(*APublicDecl), NotNull());
+
+        // Derived-class fields.
----------------
Let's also check `FooLoc`'s child storage locations. Same for the test below.


================
Comment at: clang/unittests/Analysis/FlowSensitive/TransferTest.cpp:1156-1159
+        const auto *FooLoc = cast<AggregateStorageLocation>(
+            Env.getStorageLocation(*FooDecl, SkipPast::None));
+        const auto *FooVal = cast<StructValue>(Env.getValue(*FooLoc));
+        EXPECT_THAT(FooVal->getChild(*BarDecl), NotNull());
----------------



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D122273



More information about the cfe-commits mailing list