mgehre added a comment.

I have thought about splitting the check into separate `static` & `const`, but 
kept it together because
the analysis for both cases is very similar, i.e. finding the usage of `this`.

Also, both checks share many preconditions, e.g. not applying them to virtual 
methods or methods
on class with a template base class, not applying them to constructor, not 
applying them to operators, etc
(and those preconditons are not shared with D54943 
<https://reviews.llvm.org/D54943>).

I had a look at D54943 <https://reviews.llvm.org/D54943>. Nice change! It will 
be very valuable to have the `const` analysis for variables!
Note, though, that the hard part of of making methods
`const` is not the detailed usage analysis as its done by the 
`ExprMutationAnalyzer`. Instead, the hard part
is to avoid false-positives that make the check unusable.
I had a version of this check that made a very detailed analysis just like 
`ExprMutationAnalyzer`
(restricted to `this`). But then most of the functions it flagged as `const`
(technically correct) on the LLVM code base we would not want to make const 
(logically). Examples:

  class S {
    // Technically const (the pointer Pimp itself is not modified), but 
logically should not be const
    //  because we want to consider *Pimp as part of the data.
    void setFlag() {
      *Pimp = 4;
    }
  
    int* Pimp;
  };



  class S {
    void modify() {
       // Technically const because we call a const method
      // "pointer unique_ptr::operator->() const;"
      // but logically not const.
      U->modify();
    }
  
    std::unique_ptr<Object> U;
  };



  // Real-world code, see clang::ObjCInterfaceDecl.
  class DataPattern {
    int& data() const;
  public:
  
    int& get() { // Must not be const, even though it only calls const methods
      return data();
    }
  
    const int& get() const {
      return const_cast<DataPattern *>(this)->get();
    }
  
    void set() { // Must not be const, even though it only calls const methods
      data() = 42;
    }
  };

and many more.

So the hard thing for the `const` check was to actually remove the 
sophisticated analysis I had, and come up with
something much simpler that would have no false positive (otherwise users will 
just disable the check) while
still finding something. I fear that the same could happen when we apply D54943 
<https://reviews.llvm.org/D54943> to `this` directly. It might
be easier to keep those two cases separate.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D61749



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

Reply via email to