stephanemoore added a comment.

Looks in good shape 👌 A couple nits and polish ideas.



================
Comment at: clang-tools-extra/clang-tidy/objc/DeallocInCategoryCheck.cpp:34
+
+void DeallocInCategoryCheck::check(const MatchFinder::MatchResult &Result) {
+  const auto *MatchedDecl = Result.Nodes.getNodeAs<ObjCMethodDecl>("dealloc");
----------------
What do you think of making a fixit that deletes the `-dealloc` implementation?


================
Comment at: clang-tools-extra/clang-tidy/objc/DeallocInCategoryCheck.cpp:36
+  const auto *MatchedDecl = Result.Nodes.getNodeAs<ObjCMethodDecl>("dealloc");
+  if (MatchedDecl) {
+    diag(MatchedDecl->getLocation(),
----------------
I can't speak authoritatively regarding project convention but I believe that 
it's rare to condition on a nonnull match when matching on a single AST node 
(in other words, `check` would not have been called if `MatchedDecl` were 
null). I //believe// that convention is either to omit the expected condition 
or to assert the expected condition.

Examples:
https://github.com/llvm/llvm-project/blob/master/clang-tools-extra/clang-tidy/objc/MissingHashCheck.cpp#L54
https://github.com/llvm/llvm-project/blob/master/clang-tools-extra/clang-tidy/objc/ForbiddenSubclassingCheck.cpp#L73


================
Comment at: clang-tools-extra/clang-tidy/objc/DeallocInCategoryCheck.cpp:37-38
+  if (MatchedDecl) {
+    diag(MatchedDecl->getLocation(),
+         "method -dealloc should not be implemented in a category");
+  }
----------------
What do you think of binding the category implementation declaration and 
including that in the diagnostic message?
```
  Finder->addMatcher(objcMethodDecl(isInstanceMethod(), hasName("dealloc"),
                                    
hasDeclContext(objcCategoryImplDecl().bind("impl")))
                         .bind("dealloc"),
                     this);

  // ...

  const auto *CID = Result.Nodes.getNodeAs<ObjCCategoryImplDecl>("impl");
  diag(MatchedDecl->getLocation(),
       "category %0 should not implement -dealloc") << CID;
```

(admittedly, I don't recall off the top of my head how `ObjCCategoryImplDecl` 
renders in diagnostic messages so some additional tuning could be warranted)


================
Comment at: 
clang-tools-extra/docs/clang-tidy/checks/objc-dealloc-in-category.rst:7
+Finds implementations of ``-dealloc`` in Objective-C categories. The category
+implementation will override any dealloc in the class implementation,
+potentially causing issues.
----------------
``-dealloc``


================
Comment at: 
clang-tools-extra/docs/clang-tidy/checks/objc-dealloc-in-category.rst:10-11
+
+Classes implement ``-dealloc`` to perform important actions just before an
+object is deallocated, but if a category on the class implements ``-dealloc``
+it will override the class's implementation and those important actions may
----------------
Replace "just before an object is deallocated" with "to deallocate an object".

"Deallocates the memory occupied by the receiver."
https://developer.apple.com/documentation/objectivec/nsobject/1571947-dealloc?language=objc


================
Comment at: 
clang-tools-extra/docs/clang-tidy/checks/objc-dealloc-in-category.rst:11
+Classes implement ``-dealloc`` to perform important actions just before an
+object is deallocated, but if a category on the class implements ``-dealloc``
+it will override the class's implementation and those important actions may
----------------
Replace ", but if" with ". If"?


================
Comment at: 
clang-tools-extra/docs/clang-tidy/checks/objc-dealloc-in-category.rst:11
+Classes implement ``-dealloc`` to perform important actions just before an
+object is deallocated, but if a category on the class implements ``-dealloc``
+it will override the class's implementation and those important actions may
----------------
stephanemoore wrote:
> Replace ", but if" with ". If"?
I //think// we should add a comma after ``-dealloc``?


================
Comment at: 
clang-tools-extra/docs/clang-tidy/checks/objc-dealloc-in-category.rst:12-13
+object is deallocated, but if a category on the class implements ``-dealloc``
+it will override the class's implementation and those important actions may
+not be handled by the overriding ``-dealloc``.
----------------
Isn't it a bit more nefarious than that? `-dealloc` in the main implementation 
becomes inaccessible (though the superclass can still be invoked). Perhaps it 
would suffice to say that "unexpected deallocation behavior may occur"?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D72876



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

Reply via email to