[PATCH] D81315: [analyzer] Warning for default constructed unique pointer dereferences

Nithin VR via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Jul 2 05:52:49 PDT 2020


vrnithinkumar added inline comments.


================
Comment at: clang/include/clang/StaticAnalyzer/Checkers/Checkers.td:577-583
+  CheckerOptions<[
+    CmdLineOption<Boolean,
+                  "CheckSmartPtrDereference",
+                  "Enable check for SmartPtr null dereferences",
+                  "false",
+                  InAlpha>,
+  ]>,
----------------
Szelethus wrote:
> NoQ wrote:
> > Szelethus wrote:
> > > This goes against D81750 -- Sorry for not bringing this up earlier, but you can't emit diagnostics from a checker that is hidden :/
> > > 
> > > The proper solution would be to create a non-hidden checker, and emit a diagnostic under its name. You can take inspiration from `MallocChecker`, `NullabilityChecker`, and a variety of other sound in the stack of this patch: D77845
> > Aha, ok, that's what i meant at the end of D81315#inline-760088. @Szelethus insists, so let's turn ourselves into a separate checker right away!
> > 
> > In fact, let's *not* take the inspiration from poor-man's solutions in `MallocChecker` etc., but instead let's try a full-on modular approach:
> > - Make a separate .cpp file and a separate Checker class for emitting diagnostics.
> >   - Remove the checker option and instead add a separate checker entry in Checkers.td.
> > - Subscribe the new checker on PreCall only and move all the bug reporting logic there.
> > - Keep all the modeling logic in the old checker (it's called SmartPtr//Modeling// for a reason!).
> > - Put common functionality into a header file shared between the two checkers.
> >   - In particular, the GDM trait should be only accessed through such getter.
> >     - Take some inspiration from `Taint.h`.
> Sounds great! And of course, say the word if any help is needed! :)
Thanks...!

Created a new checker `alpha.cplusplus.SmartPtr` to emit the SmartPtr dereference diagnostic.


================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:139
+
+  const auto *MethodDecl = dyn_cast_or_null<CXXMethodDecl>(OC->getDecl());
+
----------------
xazax.hun wrote:
> You should never get null here due to `isStdSmartPointerClass` guarding above. I think the null check could be transformed into an assert.
Changed to dyn_cast.
Added assert 


================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:141
+
+  if (!MethodDecl || !MethodDecl->isOverloadedOperator())
+    return;
----------------
xazax.hun wrote:
> You have a `CXXMemberOperatorCall` which already represents an overloaded operator. This check is either redundant or could be an assert instead.
Removed the redundant check


================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:144
+
+  OverloadedOperatorKind OOK = MethodDecl->getOverloadedOperator();
+  if (OOK == OO_Star || OOK == OO_Arrow) {
----------------
xazax.hun wrote:
> In case `CXXMemberOperatorCall ` class does not have a way to query the overloaded operator kind maybe it would be worth to add a helper method to that class. So you can do most of the checking using one interface only.
Added `getOverloadedOperator()` in `CXXMemberOperatorCall` class


================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:148
+    if (InnerPointVal && InnerPointVal->isZeroConstant()) {
+      reportBug(C, Call);
+    }
----------------
NoQ wrote:
> This doesn't seem to be guarded by `ShouldCheckSmartPtrDereference`.
> 
> Consider adding a LIT test for the flag to make sure we're not leaking our project to the public until it's ready ^.^ Say, you could make two run-lines in your test like this:
> ```
> // RUN: %clang_analyze_cc1 -verify=expected -analyzer-config cplusplus.SmartPtr:CheckSmartPtrDereference=true \
> // RUN: ...
> // RUN: %clang_analyze_cc1 -verify=unexpected \
> // RUN: ...
> 
> // unexpected-no-diagnostics
> ```
> (see https://clang.llvm.org/doxygen/classclang_1_1VerifyDiagnosticConsumer.html for more fancy tricks with `-verify`)
Added one more run to verify it.


================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:198
+                            *InnerPointVal);
+    C.addTransition(State);
+  }
----------------
xazax.hun wrote:
> It is possible that both `updateTrackedRegion` and this adds a transition. Both transition will have the same predecessor, i.e. you introduce a split in the exploded graph. Is this intended?
This was not intended.
- Fixed to avoid split in the exploded graph.
- Updated test to check with `clang_analyzer_numTimesReached`


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

https://reviews.llvm.org/D81315





More information about the cfe-commits mailing list