JonasToth marked 3 inline comments as done.
JonasToth added inline comments.


================
Comment at: clang-tools-extra/clang-tidy/cppcoreguidelines/CMakeLists.txt:33
   LINK_LIBS
+  clangAnalysis
   clangTidy
----------------
sammccall wrote:
> JonasToth wrote:
> > njames93 wrote:
> > > Will this work under clangd as I don't think that links in the 
> > > clangAnalysis libraries @sammccall?
> > I did not check if it works and `clangd` does not explicitly link to 
> > `Analysis`, but only to the checks.
> > Doesn't the `LINK_LIBS` induce transitive dependency resolution for linking?
> I don't know whether you need to add it everywhere, I suspect transitive is 
> OK.
> 
> In any case this isn't a new dependency, Sema depends on Analysis and clangd 
> depends on Sema.
i verified that the check works with clangd without any additional build 
settings.


================
Comment at: 
clang-tools-extra/clang-tidy/cppcoreguidelines/ConstCorrectnessCheck.cpp:29
+              ast_matchers::internal::Matcher<Decl>, InnerMatcher) {
+  return ast_matchers::internal::matchesFirstInPointerRange(
+      InnerMatcher, Node.decl_begin(), Node.decl_end(), Finder, Builder);
----------------
sammccall wrote:
> sammccall wrote:
> > This returns an iterator (i.e. a pointer), which is being converted to a 
> > boolean.
> > 
> > i.e. it's always returning true. I think this is why you're seeing nullptr 
> > crashes on Variable.
> this is depending on `::internal` details, which doesn't seem OK.
> I think you'd need to find another way to do it, or move this to ASTMatchers 
> (in a separate patch).
it is common to write custom matchers in clang-tidy first and use the internal 
matcher apis as well in clang-tidy.

```
$ cd llvm-project/clang-tools-extra/clang-tidy
$ git grep "internal::" | wc -l
86
```

Usually, they are extracted once they are generally useful. And many checks 
introduce custom matchers for better readability.
I can extract this matcher later if you want, but right now with the longevity 
of the patch and it being common practice in clang-tidy I am opposed to it.


================
Comment at: 
clang-tools-extra/clang-tidy/cppcoreguidelines/ConstCorrectnessCheck.cpp:29
+              ast_matchers::internal::Matcher<Decl>, InnerMatcher) {
+  return ast_matchers::internal::matchesFirstInPointerRange(
+      InnerMatcher, Node.decl_begin(), Node.decl_end(), Finder, Builder);
----------------
JonasToth wrote:
> sammccall wrote:
> > sammccall wrote:
> > > This returns an iterator (i.e. a pointer), which is being converted to a 
> > > boolean.
> > > 
> > > i.e. it's always returning true. I think this is why you're seeing 
> > > nullptr crashes on Variable.
> > this is depending on `::internal` details, which doesn't seem OK.
> > I think you'd need to find another way to do it, or move this to 
> > ASTMatchers (in a separate patch).
> it is common to write custom matchers in clang-tidy first and use the 
> internal matcher apis as well in clang-tidy.
> 
> ```
> $ cd llvm-project/clang-tools-extra/clang-tidy
> $ git grep "internal::" | wc -l
> 86
> ```
> 
> Usually, they are extracted once they are generally useful. And many checks 
> introduce custom matchers for better readability.
> I can extract this matcher later if you want, but right now with the 
> longevity of the patch and it being common practice in clang-tidy I am 
> opposed to it.
thank you for that hint! that would explain the issues indeed. I try to verify 
your proposed fix by re-transforming LLVM.
some other subscribers checked their own codebases as well. this would give us 
more confidence too.

if the crash is still there, I would like to keep the 'safety-if' in `check` 
and try to find the issue with the matcher.
The path @njames93 linked seemed like it would help there a lot.


================
Comment at: 
clang-tools-extra/clang-tidy/cppcoreguidelines/ConstCorrectnessCheck.cpp:84
+              compoundStmt(
+                  findAll(declStmt(allOf(containsDeclaration2(
+                                             LocalValDecl.bind("local-value")),
----------------
njames93 wrote:
> `allOf` is unnecessary here as `declStmt` is implicitly an `allOf` matcher.
> Also `findAll` isn't the right matcher in this case, you likely want 
> `forEachDescendant`. `findAll` will try and match on the `CompoundStmt` which 
> is always going to fail.
switching to `forEachDescendant`, both seem to work.
I am unsure why I used `findAll`, but I know that I started out with 
`forEachDescendant` for some bits of the check and it was insufficent.
But it could very well be, that these pieces are now in the `ExprMutAnalyzer`.


================
Comment at: 
clang-tools-extra/clang-tidy/cppcoreguidelines/ConstCorrectnessCheck.cpp:102-105
+  // There have been crashes on 'Variable == nullptr', even though the matcher
+  // is not conditional. This comes probably from 'findAll'-matching.
+  if (!Variable || !LocalScope)
+    return;
----------------
njames93 wrote:
> sammccall wrote:
> > JonasToth wrote:
> > > njames93 wrote:
> > > > This sounds like a bug that should be raised with ASTMatchers, if its 
> > > > reproducible.
> > > I found no way to reproduce it (yet).
> > > The crashes occured during verification on big projects and 
> > > `run-clang-tidy` kind of obfuscated where the crash happened.
> > > 
> > > This is something for the iron out part of the check I think.
> > This is a bug in a helper added in this patch, I've added a comment above.
> Ahh, hopefully once D118520 lands it should be easier to track down these 
> bugs and create reproducers
I am rerunning the whole analysis on LLVM to see if the crash is still there 
after the proposed fix of sam (thanks!).
I will remove the code completely if the crash is gone. Otherwise I'd rather 
keep the safety in and try to fix the underlying issue afterwards.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D54943

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

Reply via email to