NoQ added inline comments.
================
Comment at:
clang/include/clang/StaticAnalyzer/Core/BugReporter/BugSuppression.h:30-31
+public:
+ /// Return true if the given bug report was explicitly suppressed by the
user.
+ bool isSuppressed(const BugReport &);
+ /// Return true if the bug reported at the given location was explicitly
----------------
vsavchenko wrote:
> NoQ wrote:
> > So, like, i wish this could be replaced with `bool isSuppressed(const
> > PathDiagnostic &);` so that to untie this from Static Analyzer-specific
> > `BugReport` object.
> >
> > There's no straightforward way to jump from `BugReport` to its specific
> > `PathDiagnostic`, especially given that the same bug report may produce
> > different `PathDiagnostic`s for different consumers. But by the time
> > suppressions kick in we can be certain that `PathDiagnostic` objects are
> > fully constructed.
> >
> > It's an interesting question whether different `PathDiagnostic`s for the
> > same bug report may interact with suppressions differently. For now this
> > can't happen because all of them will have the same location and the same
> > uniqueing location. We should obviously avoid such differences, probably
> > protect ourselves against them with an assertion.
> In order to move fully from `BugReport` to `PathDiagnostic`, we can pre-map
> the whole TU with suppressed "areas" (in the same way we do it now for
> declarations with issues). If we do that, we need to decide where and when
> such initialization should take place.
We still have access to decl-with-issue and uniqueing-decl in `PathDiagnostic`
if that's what seems problematic to you (?)
================
Comment at: clang/lib/StaticAnalyzer/Core/BugSuppression.cpp:70
+
+class CacheInitializer : public RecursiveASTVisitor<CacheInitializer> {
+public:
----------------
vsavchenko wrote:
> NoQ wrote:
> > A recursive visitor would cause you to visit nested declarations (eg.,
> > lambdas, or methods of nested classes) multiple times. Is this necessary? A
> > plain old `ConstStmtVisitor` that's taught to visit child statements
> > recursively could easily avoid that. That's probably cheap though.
> I don't see how I can easily use `StmtVisitor`s without A LOT OF boilerplate
> code that will essentially produce a `RecursiveASTVisitor` (it is very
> possible that I just don't know about some trick). I guess we can add some
> optimization if needed, but I never had performance problems with recursive
> visitors.
The typical idiom is as follows:
```lang=c++
void VisitChildren(const Stmt *S) {
// Not a visitor callback - just a helper function.
for (const Stmt *ChildS : S->children())
if (ChildS)
Visit(ChildS);
}
void VisitStmt(const Stmt *S) {
// The default behavior that makes the visitor recursive over statements.
VisitChildren(S);
}
void VisitAttributedStmt(const AttributedStmt *AS) {
VisitAttributedNode(AS);
VisitChildren(AS); // This *optionally* goes into every overridden function.
}
```
Also you'll probably have to manually unwrap `VisitVarDecl` into
`VisitDeclStmt` with a loop over decls. But generally i think that's relatively
little boilerplate for the much better control it provides.
> I never had performance problems with recursive visitors
Me too until i started doing `clang-tidy --enable-check-profile` :D So, like, i
don't think that's going to be a real problem but kind of why not avoid it
entirely.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D93110/new/
https://reviews.llvm.org/D93110
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits