[PATCH] D144977: [analyzer] Fix of the initialization list parsing.

Domján Dániel via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Mar 2 07:39:56 PST 2023


isuckatcs added inline comments.


================
Comment at: clang/lib/StaticAnalyzer/Core/RegionStore.cpp:1787
+  if (V &&
+      (!targetType->isStructureOrClassType() && !targetType->isUnionType()))
     return *V;
----------------
I assume `targetType` is the type we want to interpret the region as. Below this condition we seem to work with arrays. If `targetType` is an array, then we return something here instead of going further and returning something else we probably want. 

Why aren't we going further in that case?


================
Comment at: clang/lib/StaticAnalyzer/Core/RegionStore.cpp:1869
+      // if we are here we have struct or union?
+      if (!VarT->isStructureType()) {
+        // TODO: support other options like unions or arrays or VLAs
----------------
What about classes? 

```
class A { 
public:
  int x;
};

struct B {
  int x;
}
```

`A` and `B` are technically the same, but `A` will fall into the true branch, `B` will fall into the false branch.


================
Comment at: clang/lib/StaticAnalyzer/Core/RegionStore.cpp:1891
+        ElemExpr = IL->getInit(Idx);
+        std::optional<SVal> ConstVal = svalBuilder.getConstantVal(ElemExpr);
+        // if there is no value create a zero one
----------------
This crashes if `ElemExpr` is a `nullptr`.


================
Comment at: clang/lib/StaticAnalyzer/Core/RegionStore.cpp:1914
+          }
+          RecIter++;
+          continue;
----------------
Consider moving this into the for loop to avoid confusion.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D144977



More information about the cfe-commits mailing list