[clangd] Clangd with assertion crashes when opening an empty `.i` file
- Dominant language
- LLVM
- Stars
- 40.5k
- Forks
- 18.7k
- PR merge metrics
- PR metrics pending
Description
requests:
```
initialize->initialized->didopen->shutdown->exit
```
It normally shows a `LSP finished, exiting with status 0`, but it then asserts:
`clangd: /clang/include/clang/Frontend/CompilerInstance.h:532: clang::Preprocessor&
clang::CompilerInstance::getPreprocessor() const: Assertion PP && "Compiler instance has no preprocessor!"' failed.`
```
I[19:25:29.599] clangd version 23.0.0git (https://github.com/llvm/llvm-project.git c75e1e62d11be965a4dca0d816a4d19a6684b043)
I[19:25:29.599] Features: linux+debug-tidy
I[19:25:29.599] PID: 34
I[19:25:29.599] Working directory:
I[19:25:29.599] argv[0]:
I[19:25:29.599] argv[1]: --background-index=0
I[19:25:29.599] argv[2]: --clang-tidy=0
I[19:25:29.599] Starting LSP over stdin/stdout
I[19:25:29.608] <-- initialize(1)
I[19:25:29.609] --> reply:initialize(1) 0 ms
Content-Length: 2077
{"id":1,"jsonrpc":"2.0","result":{"capabilities":{"astProvider":true,"callHierarchyProvider":true,"clangdInlayHintsProvider":true,"co
deActionProvider":true,"compilationDatabase":{"automaticReload":true},"completionProvider":{"resolveProvider":false,"triggerCharacter
s":[".","<",">",":","\"","/","*"]},"declarationProvider":true,"definitionProvider":true,"documentFormattingProvider":true,"documentHi
ghlightProvider":true,"documentLinkProvider":{"resolveProvider":false},"documentOnTypeFormattingProvider":{"firstTriggerCharacter":"\
n","moreTriggerCharacter":[]},"documentRangeFormattingProvider":{"rangesSupport":true},"documentSymbolProvider":true,"executeCommandP
rovider":{"commands":["clangd.applyFix","clangd.applyRename","clangd.applyTweak"]},"foldingRangeProvider":true,"hoverProvider":true,"
implementationProvider":true,"inactiveRegionsProvider":true,"inlayHintProvider":true,"memoryUsageProvider":true,"referencesProvider":
true,"renameProvider":true,"selectionRangeProvider":true,"semanticTokensProvider":{"full":{"delta":true},"legend":{"tokenModifiers":[
"declaration","definition","deprecated","deduced","readonly","static","abstract","virtual","dependentName","defaultLibrary","usedAsMu
tableReference","usedAsMutablePointer","constructorOrDestructor","userDefined","functionScope","classScope","fileScope","globalScope"
],"tokenTypes":["variable","variable","parameter","function","method","function","property","variable","class","interface","enum","en
umMember","type","type","unknown","namespace","typeParameter","concept","type","macro","modifier","operator","bracket","label","comme
nt"]},"range":false},"signatureHelpProvider":{"triggerCharacters":["(",")","{","}","<",">",","]},"standardTypeHierarchyProvider":true
,"textDocumentSync":{"change":2,"openClose":true,"save":true},"typeDefinitionProvider":true,"typeHierarchyProvider":true,"workspaceSy
mbolProvider":true},"serverInfo":{"name":"clangd","version":"clangd version 23.0.0git (https://github.com/llvm/llvm-project.git c75e1
e62d11be965a4dca0d816a4d19a6684b043) linux+debug-tidy x86_64-unknown-linux-gnu"}}}
I[19:25:29.621] <-- initialized
I[19:25:29.633] <-- textDocument/didOpen
I[19:25:29.633] Loaded compilation database from /compile_commands.json
I[19:25:29.634] ASTWorker building file /preprocessed-file.i version 1 with command
[]
-fsyntax-only -I -resource-dir= -- /preprocessed-file.i
I[19:25:29.639] Built preamble of size 242440 for file /preprocessed-file.i version 1 in 0.01 seconds
I[19:25:29.646] --> textDocument/publishDiagnostics
Content-Length: 210
{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"diagnostics":[],"uri":"file:///preprocessed-
file.i","version":1}}
I[19:25:32.648] <-- shutdown(2)
I[19:25:32.649] --> reply:shutdown(2) 0 ms
Content-Length: 38
{"id":2,"jsonrpc":"2.0","result":null}
I[19:25:32.665] <-- exit
I[19:25:32.665] LSP finished, exiting with status 0
clangd: /clang/include/clang/Frontend/CompilerInstance.h:532: clang::Preprocessor&
clang::CompilerInstance::getPreprocessor() const: Assertion `PP && "Compiler instance has no preprocessor!"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace and instructions to reprod
uce the bug.
#0 0x000064a588df08f2 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /llvm/lib/Support/Unix/Signals.inc:884:3
#1 0x000064a588ded66c llvm::sys::RunSignalHandlers() /llvm/lib/Support/Signals.cpp:108:20
#2 0x000064a588dedee1 SignalHandler(int, siginfo_t*, void*) /llvm/lib/Support/Unix/Signals.inc:448:14
#3 0x00007da2eba45330 (+0x45330)
#4 0x00007da2eba9eb2c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
#5 0x00007da2eba9eb2c __pthread_kill_internal ./nptl/pthread_kill.c:78:10
#6 0x00007da2eba9eb2c pthread_kill ./nptl/pthread_kill.c:89:10
#7 0x00007da2eba4527e raise ./signal/../sysdeps/posix/raise.c:27:6
#8 0x00007da2eba288ff abort ./stdlib/abort.c:81:7
#9 0x00007da2eba2881b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#10 0x00007da2eba3b517 (+0x3b517)
#11 0x000064a58a429f35 (+0x1ac1f35)
#12 0x000064a58a42a185 (+0x1ac2185)
#13 0x000064a58aa586b8 std::__shared_ptr::get() const /bits/
shared_ptr_base.h:1666:16
#14 0x000064a58aa586b8 std::__shared_ptr_access::_M_get() const
/bits/shared_ptr_base.h:1363:69
#15 0x000064a58aa586b8 std::__shared_ptr_access::operator*() const
/bits/shared_ptr_base.h:1349:2
#16 0x000064a58aa586b8 clang::CompilerInvocation::getFrontendOpts() /clang/include/clang/Frontend/
CompilerInvocation.h:277:48
#17 0x000064a58aa586b8 clang::CompilerInstance::getFrontendOpts() /clang/include/clang/Frontend/CompilerInstance.h:314:39
#18 0x000064a58aa586b8 clang::FrontendAction::EndSourceFile() /clang/lib/Frontend/FrontendAction.cpp:1382:40
#19 0x000064a58a432a0a std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count() /bits/
shared_ptr_base.h:1071:21
#20 0x000064a58a432a0a std::__shared_ptr::~__shared_ptr() /bits/
shared_ptr_base.h:1524:7
#21 0x000064a58a432a0a std::shared_ptr::~shared_ptr() /bits/shared_ptr.h:175:11
#22 0x000064a58a432a0a clang::clangd::ParsedAST::~ParsedAST() /clang-tools-extra/clangd/ParsedAST.cpp:775:3
#23 0x000064a58a4d9482 std::default_delete::operator()(clang::clangd::ParsedAST*) const /
bits/unique_ptr.h:99:2
#24 0x000064a58a4d9482 std::default_delete::operator()(clang::clangd::ParsedAST*) const /
bits/unique_ptr.h:93:7
#25 0x000064a58a4d9482 std::unique_ptr>::~unique_ptr()
/bits/unique_ptr.h:404:17
#26 0x000064a58a4d9482 std::_Optional_payload_base>>::_M_destroy() /optional:287:35
#27 0x000064a58a4d9482 std::_Optional_payload_base>>::_M_reset() /optional:318:14
#28 0x000064a58a4d9482 std::_Optional_payload_base>>::_M_reset() /optional:315:7
#29 0x000064a58a4d9482 std::_Optional_payload>, false, false, false>::~_Optional_payload() /optional:441:65
#30 0x000064a58a4d9482 std::_Optional_base>,
false, false>::~_Optional_base() /optional:512:12
#31 0x000064a58a4d9482 std::optional>>::~optional() /optional:707:11
#32 0x000064a58a4d9482 ~ASTWorker /clang-tools-extra/clangd/TUScheduler.cpp:854:16
#33 0x000064a58a4d9482 std::_Sp_counted_ptr::_M_dispose() /bits/shared_ptr_base.h:428:9
#34 0x000064a588dbb677 std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() /bits/
shared_ptr_base.h:347:18
#35 0x000064a588dbb677 std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() /bits/
shared_ptr_base.h:317:5
#36 0x000064a58a6bab84 llvm::detail::UniqueFunctionBase::operator=(llvm::detail::UniqueFunctionBase&&) /llvm/
include/llvm/ADT/FunctionExtras.h:329:5
#37 0x000064a58a6bab84 llvm::detail::UniqueFunctionBase::operator=(llvm::detail::UniqueFunctionBase&&) /llvm/
include/llvm/ADT/FunctionExtras.h:321:23
#38 0x000064a58a6bab84 llvm::unique_function::operator=(llvm::unique_function&&) /llvm/include/llvm/ADT/
FunctionExtras.h:352:20
#39 0x000064a58a6bab84 operator() /clang-tools-extra/clangd/support/Threading.cpp:103:14
#40 0x000064a58a6bab84 operator())::&> /llvm/include/llvm/Support/thread.h:46:16
#41 0x000064a58a6bab84 __invoke_impl):: > >(void*)::,
clang::clangd::AsyncTaskRunner::runAsync(const llvm::Twine&, llvm::unique_function)::&> /bits/
invoke.h:61:36
#42 0x000064a58a6bab84 __invoke):: > >(void*)::,
clang::clangd::AsyncTaskRunner::runAsync(const llvm::Twine&, llvm::unique_function)::&> /bits/
invoke.h:96:40
#43 0x000064a58a6bab84 __apply_impl):: > >(void*)::,
std::tuple):: >&, 0>
/tuple:2302:27
#44 0x000064a58a6bab84 apply):: > >(void*)::,
std::tuple):: >&>
/tuple:2313:31
#45 0x000064a58a6bab84 GenericThreadProxy):: > > /llvm/include/llvm/Support/thread.h:44:15
#46 0x000064a58a6bab84 void* llvm::thread::ThreadProxy)::'lambda0'()>>(void*) /llvm/include/llvm/Support/thread.h:62:36
#47 0x00007da2eba9caa4 start_thread ./nptl/pthread_create.c:447:8
#48 0x00007da2ebb29c6c clone3 ./misc/../sysdeps/unix/sysv/linux/x86_64/clone3.S:80:0
/run_clangd_didopen_workspace.sh: line 91: 33 Done { emit_lsp "$INIT"; emit_lsp "$INITIALIZED";
emit_lsp "$DIDOPEN"; sleep "$DIDOPEN_WAIT_SECS"; emit_lsp "$SHUTDOWN"; emit_lsp "$EXIT"; }
34 Aborted (core dumped) | ( cd "$WORKDIR"; "$TARGET" "${TARGET_ARGS[@]}" )
```
Contributor guide
Research direction
Reproduce the initialize–didOpen–shutdown–exit sequence with an empty .i file and the shown compile_commands.json. Read the cleanup path in clang-tools-extra/clangd/ParsedAST.cpp and TUScheduler.cpp alongside FrontendAction.cpp and CompilerInstance.h. Done means clangd exits normally without asserting after this sequence.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp
- Domain
- compilers, devtools
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 55/100