NoQ accepted this revision.
NoQ added a subscriber: george.karpenkov.
NoQ added a comment.
This revision is now accepted and ready to land.

Very nice! Crashing diagnostic locations are a fairly common issue. That said, 
this still makes me wonder what sort of checker were you writing that triggered 
this originally :)



================
Comment at: lib/StaticAnalyzer/Checkers/DebugCheckers.cpp:271
+//===----------------------------------------------------------------------===//
+// Emits a report for each and every Stmt.
+//===----------------------------------------------------------------------===//
----------------
Technically, we don't invoke `checkPreStmt` for every `Stmt` (eg., `IfStmt` is 
omitted in favor of `checkBranchCondition`, `IntegerLiteral` is outright 
skipped because `ExprEngine` doesn't even evaluate anything at this point). 
Moreover, for some `Stmt`s we more-or-less-intentionally only invoke 
`checkPreStmt` but not `checkPostStmt`.

Also would you eventually want to expand this checker with non-`Stmt` callbacks?


================
Comment at: lib/StaticAnalyzer/Checkers/DebugCheckers.cpp:277
+class ReportStmts : public Checker<check::PreStmt<Stmt>> {
+  std::unique_ptr<BuiltinBug> BT_stmtLoc;
+
----------------
My current favorite approach is:
```lang=c++
BuiltinBug BT_stmtLoc{this, "Statement"};
```

...and remove the constructor. And remove the `*` in your 
`make_unique<BugReport>`.


================
Comment at: lib/StaticAnalyzer/Core/PathDiagnostic.cpp:574-575
 
+  // FIXME: Ironically, this assert actually fails in some cases.
+  //assert(L.isValid());
   return L;
----------------
A normal day in Clang :)


================
Comment at: lib/StaticAnalyzer/Core/PathDiagnostic.cpp:679
+
+  if (ME->getMemberLoc().isValid())
+    return PathDiagnosticLocation(ME->getMemberLoc(), SM, SingleLocK);
----------------
I think it's worth commenting why exactly this may fail. It's fairly hard to 
guess that we're talking about member operators.


================
Comment at: test/Analysis/invalid-pos-fix.cpp:6
+
+struct h {
+  operator int();
----------------
Random ideas on organizing tests so that to avoid adding thousands of one-test 
files:
* Give these objects fancier names and/or add a `no-crash` so that it was clear 
that this test tests a crash for reporting a bug over a `MemberExpr` that 
corresponds to an `operator()`
* Or maybe wrap this into a namespace, so that it was easier to expand this 
file.
* We traditionally put such tests into `test/Analysis/diagnostics`, dunno why 
though.
etc.

I also recall @george.karpenkov arguing for making test directory structure 
mirror source directory structure, but that's definitely not a blocker for this 
patch :]


================
Comment at: test/Analysis/invalid-pos-fix.cpp:11-13
+  return h(); // expected-warning{{Statement}}
+              // expected-warning@-1{{Statement}}
+              // expected-warning@-2{{Statement}}
----------------
`// expected-warning 3 {{Statement}}`


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

https://reviews.llvm.org/D58777



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

Reply via email to