llvm / llvm/llvm-project

[clangd] Clangd with assertion crashes when opening an empty `.i` file

Open
#197,662 2 comments 0 reactions 0 assignees View on GitHub
clangd crash
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.