[PATCH] D65361: [analyzer] Trust global initializers when analyzing main().

Balogh, Ádám via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Jul 29 07:37:15 PDT 2019

baloghadamsoftware added a comment.

Thank you for working on this! I agree, we should trust global initializers in `main()` in C. Can we maybe detect whether GNU global constructors are enabled or better: used?

Comment at: clang/lib/StaticAnalyzer/Core/RegionStore.cpp:395
   StoreRef getInitialStore(const LocationContext *InitLoc) override {
+    bool IsMainAnalysis = false;
I think this function deserves now some doc comments since it is not a trivial getter anymore.

Comment at: clang/lib/StaticAnalyzer/Core/RegionStore.cpp:630
+        (const RegionBindings::TreeTy *)((uintptr_t)store & ~(uintptr_t)1),
+        RBFactory.getTreeFactory(), (bool)((uintptr_t)store & (uintptr_t)1));
`(uintptr_t)1` look like a bit like some kind of magic number. Could we define it as a constant instead?

Comment at: clang/lib/StaticAnalyzer/Core/RegionStore.cpp:1693
     const VarDecl *VD = VR->getDecl();
     // Either the array or the array element has to be const.
+    if (VD->getType().isConstQualified() ||
Please, update the comment as well.

Comment at: clang/lib/StaticAnalyzer/Core/RegionStore.cpp:1785
     unsigned Index = FD->getFieldIndex();
     // Either the record variable or the field has to be const qualified.
+    if (RecordVarTy.isConstQualified() || Ty.isConstQualified() ||
This one as well.

Comment at: clang/lib/StaticAnalyzer/Core/RegionStore.cpp:2005
+    if (B.isMainAnalysis())
+      if (const Expr *Init = VD->getAnyInitializer())
Please add a comment to the block as well.

Comment at: clang/test/Analysis/main.c:21
+  return 0;
Please add a negative test case (i.e. function that is not `main`) as well.



More information about the cfe-commits mailing list