[cfe-dev] RFC: Pumping Clang-Tidy warnings through the Static Analyzer's BugReporter.

Artem Dergachev via cfe-dev cfe-dev at lists.llvm.org
Tue Aug 13 20:00:43 PDT 2019


As i've been vaguely hinting on EuroLLVM, i plan to invest some time in 
decreasing the gap between Clang-Tidy users and Static Analyzer users 
and make sure it's always possible for our users to take the best of 
both worlds. In particular, i'd like to make Clang-Tidy easily 
integratable into all UIs that already integrate the Static Analyzer. 
The opposite is already true because Clang-Tidy links to the Static 
Analyzer. However, existing Static Analyzer users (eg., users that rely 
on Scan-Build for their build system interception or use the Static 
Analyzer through Xcode) cannot easily take advantage of Clang-Tidy. 
Also, as far as i understand, Ericsson CodeChecker currently performs 
ad-hoc integration of Clang-Tidy by parsing text output, which most 
likely works just fine, but definitely contributes to anxiety. On the 
other hand, the BugReporter facility of the Static Analyzer has a 
variety of output modes, including fancy html reports and 
machine-readable plist output, so if we pump Clang-Tidy reports through 
the same BugReporter it'll open up some new possibilities.

Ideally i'd love to do the same to Clang-Tidy that Clang-Tidy does to 
us: make the Static Analyzer load it as a library and expose Clang-Tidy 
checks as its own, maybe in a separate package. This is harder to do 
though, because Clang-Tidy lives in a separate repo and also it's a hard 
sell to build it into the Clang binary. I'm open to suggestions here: we 
can keep such integration under an off-by-default CMake flag (which 
requires enabling compilation of clang-tools-extra) or we may even use 
it as a run-time plugin (i mean, clang plugins are super wonky, but this 
time it's actually fairly easy to avoid version conflicts, as they all 
get compiled from the same sources simultaneously).

But regardless of how far do i end up going with such integration, first 
thing first: i'll anyway need to teach Clang-Tidy how to route its 
diagnostics through our diagnostic engine. This is also the only thing 
that's absolutely necessary; the rest can always be hacked up on the UI 
side.

It's a great question why didn't we extend Clang's DiagnosticEngine to 
begin with, but instead made our own facility. I don't know the answer 
to that; this happened way before i even learned what an AST is :) We 
generally needed a much more sophisticated diagnostic engine because our 
reports are much more complicated. While we could try to unify these 
diagnostic engines completely, i don't think it's worth it.

So i think it's more feasible to make Clang-Tidy's diag() method return 
a proxy object that mimics the DiagnosticBuilder interface but may also 
pump the diagnostics to an instance of the Static Analyzer's 
BugReporter. I hope this would avoid API breakages for clang-tidy checks.

It is going to be a bit annoying that DiagnosticBuilder treats warnings 
and their respective notes as completely unrelated diagnostics, while 
for the purposes of the BugReporter they need to be on the same 
BugReport object. I should be able to take care of this on the 
BugReporter side as long as clang-tidy checkers promise to always emit 
notes immediately after their respective warnings (which seems to be the 
case, but i didn't look at *all* the checks).

Finally, one feature that BugReporter was lacking until recently was the 
fix-it hint support. However, this is mostly out of the way since 
https://reviews.llvm.org/D65182.

Does any of that sound reasonable? Should i proceed with this?



More information about the cfe-dev mailing list