[analyzer] Print the offending function at EndAnalysis crash
authorBalazs Benics <balazs.benics@sigmatechnology.se>
Fri, 10 Jun 2022 10:21:17 +0000 (12:21 +0200)
committerBalazs Benics <balazs.benics@sigmatechnology.se>
Fri, 10 Jun 2022 10:21:17 +0000 (12:21 +0200)
commit07a7fd314a118393e6ca5e4dbcc9c3d91ff96172
treea57a71309c3d352dd0b4c5407b7ea50d3c9b77a6
parent007917b95ce2b569a8e5e90cd9b819676a6bb364
[analyzer] Print the offending function at EndAnalysis crash

I've faced crashes in the past multiple times when some
`check::EndAnalysis` callback caused some crash.
It's really anoying that it doesn't tell which function triggered this
callback.

This patch adds the well-known trace for that situation as well.
Example:
  1.      <eof> parser at end of file
  2.      While analyzing stack:
          #0 Calling test11

Note that this does not have tests.
I've considered `unittests` for this purpose, by using the
`ASSERT_DEATH()` similarly how we check double eval called functions in
`ConflictingEvalCallsTest.cpp`, however, that the testsuite won't invoke
the custom handlers. Only the message of the `llvm_unreachable()` will
be printed. Consequently, it's not applicable for us testing this
feature.

I've also considered using an end-to-end LIT test for this.
For that, we would need to somehow overload the `clang_analyzer_crash()`
`ExprInspection` handler, to get triggered by other events than the
`EvalCall`. I'm not saying that we could not come up with a generic way
of causing crash in a specific checker callback, but I'm not sure if
that would worth the effort.

Reviewed By: martong

Differential Revision: https://reviews.llvm.org/D127389
clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h
clang/lib/StaticAnalyzer/Core/ExprEngine.cpp