vsavchenko added a comment.

Great start!
I think you are on the right track, so maybe this code won't be thrown away at 
all :-)
Try to work on tests and get familiar with `lit`.



================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:31
 namespace {
-class SmartPtrModeling : public Checker<eval::Call> {
+struct RegionState {
+private:
----------------
xazax.hun wrote:
> I think `RegionState` is not very descriptive. I'd call it something like 
> `RegionNullness`.
linter: LLVM coding standards require to use `class` keyword in situations like 
this 
(https://llvm.org/docs/CodingStandards.html#use-of-class-and-struct-keywords).  
I would even say that `struct` is good for POD types.


================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:33
+private:
+  enum Kind { Null, NonNull, Unknown } K;
+  RegionState(Kind InK) : K(InK) {}
----------------
I think that it would be better to put declarations for `enum` and for a field 
separately.
Additionally, I don't think that `K` is a very good name for a data member.  It 
should be evident from the name of the member what is it.  Shot names like that 
can be fine only for iterators or for certain `clang`-specific structures 
because of existing traditions (like `SM` for `SourceManager` and `LO` for 
`LanguageOptions`).


================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:119
+  ProgramStateRef State = C.getState();
+  const auto OC = dyn_cast<CXXMemberOperatorCall>(&Call);
+  if (!OC)
----------------
xazax.hun wrote:
> Here the const applies for the pointer, not the pointee. We usually do `const 
> auto *OC` instead.
As I said above, I think we should be really careful about abbreviated and 
extremely short variable names.  Longer names make it much easier to read the 
code without paying a lot of attention to declarations.


================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:160-187
+  if (const auto IC = dyn_cast<CXXInstanceCall>(&Call)) {
+    const auto MethodDecl = dyn_cast_or_null<CXXMethodDecl>(IC->getDecl());
+    if (!MethodDecl)
+      return;
+    auto ArgsNum = IC->getNumArgs();
+
+    if (ArgsNum == 0 && isResetMethod(MethodDecl)) {
----------------
Considering the fact that more cases and more functions will get supported in 
the future, I vote for merging common parts of these two blocks.


================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:230
+
+bool SmartPtrModeling::isResetMethod(const CXXMethodDecl *MethodDec) const {
+  if (!MethodDec)
----------------
I believe that methods (and data members related to them) can be `static`.


================
Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:233
+    return false;
+  if (MethodDec->getDeclName().isIdentifier()) {
+    return ResetMethods.count(MethodDec->getName().lower());
----------------
I'm not sure about it myself, but can `DeclName` be `isEmpty()`?  If yes, it is 
a potential null-pointer dereference.  Again, I don't know it for a fact, but I 
think it should be checked.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D81315



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to