Skip to content

Crash by using ClangTool and --serialize-diagonstics-option #22563

@llvmbot

Description

@llvmbot
Bugzilla Link 22189
Version trunk
OS MacOS X
Attachments Test-case for reproducing
Reporter LLVM Bugzilla Contributor

Extended Description

I'm writing a ClangTool that uses auto-generated compilation-databases, so some of them contain the --serialize-diagnostics-option. When the ClangTool tries to build the AST, it crashes in the destructor of a BitStreamWriter.

I'm attaching a test-case that reproduces the crash and produces the following output on my machine:

/a.cc:1:10: fatal error: 'stdarg.h' file not found
#include <stdarg.h>

Assertion failed: (BlockScope.empty() && CurAbbrevs.empty() && "Block imbalance"), function ~BitstreamWriter, file /Users/hendrikvonprince/develop/thirdparty/llvm-trunk/include/llvm/Bitcode/BitstreamWriter.h, line 101.
0 ToolingTests 0x0000000106261e7e llvm::sys::PrintStackTrace(__sFILE*) + 46
1 ToolingTests 0x000000010626322b PrintStackTraceSignalHandler(void*) + 27
2 ToolingTests 0x0000000106263675 SignalHandler(int) + 565
3 libsystem_platform.dylib 0x00007fff8d8f15aa _sigtramp + 26
4 libsystem_platform.dylib 0x00007fff5b5e49d8 _sigtramp + 3452908616
5 ToolingTests 0x000000010626325b raise + 27
6 ToolingTests 0x0000000106263312 abort + 18
7 ToolingTests 0x00000001062632f1 __assert_rtn + 129
8 ToolingTests 0x0000000104d7cc29 llvm::BitstreamWriter::~BitstreamWriter() + 249
9 ToolingTests 0x0000000104d6cc65 llvm::BitstreamWriter::~BitstreamWriter() + 21
10 ToolingTests 0x0000000104e4cc05 (anonymous namespace)::SDiagsWriter::SharedState::~SharedState() + 357
11 ToolingTests 0x0000000104e4ca95 (anonymous namespace)::SDiagsWriter::SharedState::~SharedState() + 21
12 ToolingTests 0x0000000104e4ca63 llvm::RefCountedBase<(anonymous namespace)::SDiagsWriter::SharedState>::Release() const + 163
13 ToolingTests 0x0000000104e4c9b5 llvm::IntrusiveRefCntPtrInfo<(anonymous namespace)::SDiagsWriter::SharedState>::release((anonymous namespace)::SDiagsWriter::SharedState*) + 21
14 ToolingTests 0x0000000104e4c98d llvm::IntrusiveRefCntPtr<(anonymous namespace)::SDiagsWriter::SharedState>::release() + 45
15 ToolingTests 0x0000000104e4c955 llvm::IntrusiveRefCntPtr<(anonymous namespace)::SDiagsWriter::SharedState>::~IntrusiveRefCntPtr() + 21
16 ToolingTests 0x0000000104e4c935 llvm::IntrusiveRefCntPtr<(anonymous namespace)::SDiagsWriter::SharedState>::~IntrusiveRefCntPtr() + 21
17 ToolingTests 0x0000000104e4c905 (anonymous namespace)::SDiagsWriter::~SDiagsWriter() + 53
18 ToolingTests 0x0000000104e49115 (anonymous namespace)::SDiagsWriter::~SDiagsWriter() + 21
19 ToolingTests 0x0000000104e49139 (anonymous namespace)::SDiagsWriter::~SDiagsWriter() + 25
20 ToolingTests 0x0000000104d93b83 clang::ChainedDiagnosticConsumer::~ChainedDiagnosticConsumer() + 291
21 ToolingTests 0x0000000104d93805 clang::ChainedDiagnosticConsumer::~ChainedDiagnosticConsumer() + 21
22 ToolingTests 0x0000000104d93829 clang::ChainedDiagnosticConsumer::~ChainedDiagnosticConsumer() + 25
23 ToolingTests 0x0000000106025355 clang::DiagnosticsEngine::setClient(clang::DiagnosticConsumer*, bool) + 261
24 ToolingTests 0x00000001060259cb clang::DiagnosticsEngine::~DiagnosticsEngine() + 43
25 ToolingTests 0x0000000106025bb5 clang::DiagnosticsEngine::~DiagnosticsEngine() + 21
26 ToolingTests 0x0000000104e09d33 llvm::RefCountedBaseclang::DiagnosticsEngine::Release() const + 163
27 ToolingTests 0x0000000104e09c85 llvm::IntrusiveRefCntPtrInfoclang::DiagnosticsEngine::release(clang::DiagnosticsEngine*) + 21
28 ToolingTests 0x0000000104e09c5d llvm::IntrusiveRefCntPtrclang::DiagnosticsEngine::release() + 45
29 ToolingTests 0x0000000104e09c25 llvm::IntrusiveRefCntPtrclang::DiagnosticsEngine::~IntrusiveRefCntPtr() + 21
30 ToolingTests 0x0000000104e08365 llvm::IntrusiveRefCntPtrclang::DiagnosticsEngine::~IntrusiveRefCntPtr() + 21
31 ToolingTests 0x0000000104d4612f clang::ASTUnit::~ASTUnit() + 3503
32 ToolingTests 0x0000000104d463d5 clang::ASTUnit::~ASTUnit() + 21
33 ToolingTests 0x0000000104d463f9 clang::ASTUnit::ASTUnit() + 25
34 ToolingTests 0x0000000104c83cf5 std::__1::__vector_base<std::__1::unique_ptr<clang::ASTUnit, std::__1::default_deleteclang::ASTUnit >, std::__1::allocator<std::__1::unique_ptr<clang::ASTUnit, std::__1::default_deleteclang::ASTUnit > > >::
__vector_base() + 517
35 ToolingTests 0x0000000104c83ae5 std::__1::vector<std::__1::unique_ptr<clang::ASTUnit, std::__1::default_deleteclang::ASTUnit >, std::__1::allocator<std::__1::unique_ptr<clang::ASTUnit, std::__1::default_deleteclang::ASTUnit > > >::~vector() + 21
36 ToolingTests 0x0000000104c81ab5 std::__1::vector<std::__1::unique_ptr<clang::ASTUnit, std::__1::default_deleteclang::ASTUnit >, std::__1::allocator<std::__1::unique_ptr<clang::ASTUnit, std::__1::default_deleteclang::ASTUnit > > >::~vector() + 21
37 ToolingTests 0x0000000104c7e1f6 clang::tooling::ClangToolTest_BuildASTsOnInvalidSource_Test::TestBody() + 4006
38 ToolingTests 0x0000000106116a03 void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::)(), char const) + 131
39 ToolingTests 0x000000010610600e void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::)(), char const) + 110
40 ToolingTests 0x00000001060f13c5 testing::Test::Run() + 197
41 ToolingTests 0x00000001060f1fdb testing::TestInfo::Run() + 219
42 ToolingTests 0x00000001060f2b07 testing::TestCase::Run() + 231
43 ToolingTests 0x00000001060f8bde testing::internal::UnitTestImpl::RunAllTests() + 926
44 ToolingTests 0x0000000106113793 bool testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::)(), char const) + 131
45 ToolingTests 0x000000010610803e bool testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::)(), char const) + 110
46 ToolingTests 0x00000001060f8824 testing::UnitTest::Run() + 100
47 ToolingTests 0x000000010611e1f9 main + 89
48 libdyld.dylib 0x00007fff8f4165fd start + 1
49 libdyld.dylib 0x0000000000000002 start + 1891539462

I tried to track it down and as far as I see it, there is a missing ExitDiagBlock() to the corresponding EnterDiagBlock in line 603 of SerializedDiagnosticPrinter (inside the if-statement that checks on DiagLevel != DiagnosticsEngine::Note), but I'm not sure about it as I wasn't able to figure out how to fix it.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugzillaIssues migrated from bugzillaclang:frontendLanguage frontend issues, e.g. anything involving "Sema"clang:toolingLibToolingcrashPrefer [crash-on-valid] or [crash-on-invalid]

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions