#947107 iwyu: crash (SIGABRT): Assertion failed: Cycle in include-mapping

Package:
iwyu
Source:
iwyu
Description:
Analyze #includes in C and C++ source files
Submitter:
Paul Wise
Date:
2019-12-21 03:27:04 UTC
Severity:
normal
#947107#5
Date:
2019-12-21 03:25:01 UTC
From:
To:
I found a case that crashes iwyu with a SIGABRT:

$ sudo apt -qq install libboost-python-dev libboost-dev

$ echo '#include <boost/python/detail/type_list_impl.hpp>' > foo.cpp

$ gdb -batch -n -ex 'set pagination off' -ex run -ex bt -ex 'bt full' -ex 'thread apply all bt full' --args include-what-you-use foo.cpp
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Cycle in include-mapping:
  <boost/python/detail/type_list_impl.hpp> ->
  <boost/preprocessor/iteration/detail/iter/forward1.hpp> ->
  <boost/preprocessor/iteration/detail/iter/forward1.hpp>
/build/iwyu-oe4HdZ/iwyu-8.0/iwyu_include_picker.cc:928: Assertion failed: Cycle in include-mapping

Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50	../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1  0x00007ffff3ef7535 in __GI_abort () at abort.c:79
#2  0x000055555570ee58 in include_what_you_use::FatalMessageEmitter::~FatalMessageEmitter() ()
#3  0x0000555555933969 in include_what_you_use::(anonymous namespace)::MakeNodeTransitive(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, include_what_you_use::(anonymous namespace)::TransitiveStatus, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, include_what_you_use::(anonymous namespace)::TransitiveStatus> > >*, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()
#4  0x0000555555933a6e in include_what_you_use::(anonymous namespace)::MakeNodeTransitive(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, include_what_you_use::(anonymous namespace)::TransitiveStatus, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, include_what_you_use::(anonymous namespace)::TransitiveStatus> > >*, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()
#5  0x0000555555933a6e in include_what_you_use::(anonymous namespace)::MakeNodeTransitive(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, include_what_you_use::(anonymous namespace)::TransitiveStatus, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, include_what_you_use::(anonymous namespace)::TransitiveStatus> > >*, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()
#6  0x0000555555933bc2 in include_what_you_use::(anonymous namespace)::MakeMapTransitive(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >*) ()
#7  0x00005555559356f4 in include_what_you_use::IncludePicker::FinalizeAddedIncludes() ()
#8  0x000055555596bcff in include_what_you_use::IwyuPreprocessorInfo::HandlePreprocessingDone() ()
#9  0x0000555555720ae5 in include_what_you_use::IwyuAstConsumer::HandleTranslationUnit(clang::ASTContext&) ()
#10 0x0000555556392393 in clang::ParseAST(clang::Sema&, bool, bool) ()
#11 0x000055555616312f in clang::FrontendAction::Execute() ()
#12 0x0000555556122ca8 in clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) ()
#13 0x00005555557225f6 in main ()
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
        set = {__val = {0, 0, 140737287603840, 0, 10, 0, 895, 0, 0, 281470681751424, 0, 0, 0, 0, 0, 0}}
        pid = <optimized out>
        tid = <optimized out>
        ret = <optimized out>
#1  0x00007ffff3ef7535 in __GI_abort () at abort.c:79
        save_stage = 1
        act = {__sigaction_handler = {sa_handler = 0x1700000014, sa_sigaction = 0x1700000014}, sa_mask = {__val = {4294967321, 103079215120, 47244640260, 55834574858, 64424509462, 140737488343792, 140737288834472, 10, 10, 140737488343792, 140737288834906, 1, 140737287603840, 140737287607648, 140737286259626, 140737289557536}}, sa_flags = 0, sa_restorer = 0x0}
        sigs = {__val = {32, 0 <repeats 15 times>}}
#2  0x000055555570ee58 in include_what_you_use::FatalMessageEmitter::~FatalMessageEmitter() ()
No symbol table info available.
#3  0x0000555555933969 in include_what_you_use::(anonymous namespace)::MakeNodeTransitive(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, include_what_you_use::(anonymous namespace)::TransitiveStatus, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, include_what_you_use::(anonymous namespace)::TransitiveStatus> > >*, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()
No symbol table info available.
#4  0x0000555555933a6e in include_what_you_use::(anonymous namespace)::MakeNodeTransitive(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, include_what_you_use::(anonymous namespace)::TransitiveStatus, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, include_what_you_use::(anonymous namespace)::TransitiveStatus> > >*, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()
No symbol table info available.
#5  0x0000555555933a6e in include_what_you_use::(anonymous namespace)::MakeNodeTransitive(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, include_what_you_use::(anonymous namespace)::TransitiveStatus, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, include_what_you_use::(anonymous namespace)::TransitiveStatus> > >*, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()
No symbol table info available.
#6  0x0000555555933bc2 in include_what_you_use::(anonymous namespace)::MakeMapTransitive(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >*) ()
No symbol table info available.
#7  0x00005555559356f4 in include_what_you_use::IncludePicker::FinalizeAddedIncludes() ()
No symbol table info available.
#8  0x000055555596bcff in include_what_you_use::IwyuPreprocessorInfo::HandlePreprocessingDone() ()
No symbol table info available.
#9  0x0000555555720ae5 in include_what_you_use::IwyuAstConsumer::HandleTranslationUnit(clang::ASTContext&) ()
No symbol table info available.
#10 0x0000555556392393 in clang::ParseAST(clang::Sema&, bool, bool) ()
No symbol table info available.
#11 0x000055555616312f in clang::FrontendAction::Execute() ()
No symbol table info available.
#12 0x0000555556122ca8 in clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) ()
No symbol table info available.
#13 0x00005555557225f6 in main ()
No symbol table info available.

Thread 1 (Thread 0x7ffff3c91740 (LWP 404180)):
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
        set = {__val = {0, 0, 140737287603840, 0, 10, 0, 895, 0, 0, 281470681751424, 0, 0, 0, 0, 0, 0}}
        pid = <optimized out>
        tid = <optimized out>
        ret = <optimized out>
#1  0x00007ffff3ef7535 in __GI_abort () at abort.c:79
        save_stage = 1
        act = {__sigaction_handler = {sa_handler = 0x1700000014, sa_sigaction = 0x1700000014}, sa_mask = {__val = {4294967321, 103079215120, 47244640260, 55834574858, 64424509462, 140737488343792, 140737288834472, 10, 10, 140737488343792, 140737288834906, 1, 140737287603840, 140737287607648, 140737286259626, 140737289557536}}, sa_flags = 0, sa_restorer = 0x0}
        sigs = {__val = {32, 0 <repeats 15 times>}}
#2  0x000055555570ee58 in include_what_you_use::FatalMessageEmitter::~FatalMessageEmitter() ()
No symbol table info available.
#3  0x0000555555933969 in include_what_you_use::(anonymous namespace)::MakeNodeTransitive(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, include_what_you_use::(anonymous namespace)::TransitiveStatus, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, include_what_you_use::(anonymous namespace)::TransitiveStatus> > >*, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()
No symbol table info available.
#4  0x0000555555933a6e in include_what_you_use::(anonymous namespace)::MakeNodeTransitive(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, include_what_you_use::(anonymous namespace)::TransitiveStatus, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, include_what_you_use::(anonymous namespace)::TransitiveStatus> > >*, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()
No symbol table info available.
#5  0x0000555555933a6e in include_what_you_use::(anonymous namespace)::MakeNodeTransitive(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, include_what_you_use::(anonymous namespace)::TransitiveStatus, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, include_what_you_use::(anonymous namespace)::TransitiveStatus> > >*, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()
No symbol table info available.
#6  0x0000555555933bc2 in include_what_you_use::(anonymous namespace)::MakeMapTransitive(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >*) ()
No symbol table info available.
#7  0x00005555559356f4 in include_what_you_use::IncludePicker::FinalizeAddedIncludes() ()
No symbol table info available.
#8  0x000055555596bcff in include_what_you_use::IwyuPreprocessorInfo::HandlePreprocessingDone() ()
No symbol table info available.
#9  0x0000555555720ae5 in include_what_you_use::IwyuAstConsumer::HandleTranslationUnit(clang::ASTContext&) ()
No symbol table info available.
#10 0x0000555556392393 in clang::ParseAST(clang::Sema&, bool, bool) ()
No symbol table info available.
#11 0x000055555616312f in clang::FrontendAction::Execute() ()
No symbol table info available.
#12 0x0000555556122ca8 in clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) ()
No symbol table info available.
#13 0x00005555557225f6 in main ()
No symbol table info available.