Skip to content

[clangd/clang-format] Stack overflow when formatting a file with deep nested braces #138099

Open
@henryhchchc

Description

@henryhchchc

Create a head file main.h with deep nested braces (>= 6000 level), and open it with a code editor with clangd enabled.

   #ifndef  __riscv_vlsseg4e16_v_bf16mf4x4_tu
#define PUBLIC_H
#include "private.h"void pub() {...{
  return (v128_t)(-(__f32x4)__a);
}...}

#endif

Select all the code and format it. Clangd will crash when handling textDocument/rangeFormatting, with the following stack pattern.

 #5 0x000000000facca5f clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3182:0
  #6 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
  #7 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
  #8 0x000000000fad05f0 clang::format::(anonymous namespace)::ExpressionParser::parseConditionalExpr() /src/clang/lib/Format/TokenAnnotator.cpp:3419:10
  #9 0x000000000fad05f0 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3196:7
 #10 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #11 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
 #12 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #13 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
 #14 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #15 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
 #16 0x000000000facf4cf clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3278:16
 #17 0x000000000fad02c0 clang::format::(anonymous namespace)::ExpressionParser::parseUnaryOperator() /src/clang/lib/Format/TokenAnnotator.cpp:0:5
 #18 0x000000000fad02c0 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3203:7
 #19 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #20 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
 #21 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #22 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
 #23 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #24 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
 #25 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #26 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
 #27 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #28 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
 #29 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #30 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
 #31 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #32 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
 #33 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #34 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
 #35 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::getCurrentPrecedence() /src/clang/lib/Format/TokenAnnotator.cpp:3329:9
 #36 0x000000000face575 clang::format::(anonymous namespace)::ExpressionParser::parse(int) /src/clang/lib/Format/TokenAnnotator.cpp:3228:31
...
Thread T132 created by T0 here:
    #0 0x585fd95 in pthread_create (/src/build/bin/clangd+0x585fd95) (BuildId: c3ce5beed26c9a8a)
    #1 0x5dfe568 in llvm::llvm_execute_on_thread_impl(void* (*)(void*), void*, std::optional<unsigned int>) /src/llvm/lib/Support/Unix/Threading.inc:96:17
    #2 0x92fa751 in llvm::thread::thread<clang::clangd::AsyncTaskRunner::runAsync(llvm::Twine const&, llvm::unique_function<void ()>)::$_1>(std::optional<unsigned int>, clang::clangd::AsyncTaskRunner::runAsync(llvm::Twine const&, llvm::unique_function<void ()>)::$_1&&) /src/llvm/include/llvm/Support/thread.h:131:12
    #3 0x92fa751 in clang::clangd::AsyncTaskRunner::runAsync(llvm::Twine const&, llvm::unique_function<void ()>) /src/clang-tools-extra/clangd/support/Threading.cpp:107:16
    #4 0x8fc1cba in clang::clangd::TUScheduler::runWithSemaphore(llvm::StringRef, llvm::StringRef, llvm::unique_function<void ()>, clang::clangd::Semaphore&) /src/clang-tools-extra/clangd/TUScheduler.cpp:1733:18
    #5 0x8fc286f in clang::clangd::TUScheduler::runQuick(llvm::StringRef, llvm::StringRef, llvm::unique_function<void ()>) /src/clang-tools-extra/clangd/TUScheduler.cpp:1719:3
    #6 0x8a8f6a0 in clang::clangd::ClangdServer::formatFile(llvm::StringRef, std::optional<clang::clangd::Range>, llvm::unique_function<void (llvm::Expected<clang::tooling::Replacements>)>) /src/clang-tools-extra/clangd/ClangdServer.cpp:550:18
    #7 0x89cad41 in clang::clangd::ClangdLSPServer::onDocumentRangeFormatting(clang::clangd::DocumentRangeFormattingParams const&, llvm::unique_function<void (llvm::Expected<std::vector<clang::clangd::TextEdit, std::allocator<clang::clangd::TextEdit>>>)>) /src/clang-tools-extra/clangd/ClangdLSPServer.cpp:957:11
    #8 0x8a365e3 in void clang::clangd::LSPBinder::method<clang::clangd::DocumentRangeFormattingParams, std::vector<clang::clangd::TextEdit, std::allocator<clang::clangd::TextEdit>>, clang::clangd::ClangdLSPServer>(llvm::StringLiteral, clang::clangd::ClangdLSPServer*, void (clang::clangd::ClangdLSPServer::*)(clang::clangd::DocumentRangeFormattingParams const&, llvm::unique_function<void (llvm::Expected<std::vector<clang::clangd::TextEdit, std::allocator<clang::clangd::TextEdit>>>)>))::'lambda'(llvm::json::Value, llvm::unique_function<void (llvm::Expected<llvm::json::Value>)>)::operator()(llvm::json::Value, llvm::unique_function<void (llvm::Expected<llvm::json::Value>)>) const /src/clang-tools-extra/clangd/LSPBinder.h:141:5
    #9 0x8a36175 in void llvm::detail::UniqueFunctionBase<void, llvm::json::Value, llvm::unique_function<void (llvm::Expected<llvm::json::Value>)>>::CallImpl<void clang::clangd::LSPBinder::method<clang::clangd::DocumentRangeFormattingParams, std::vector<clang::clangd::TextEdit, std::allocator<clang::clangd::TextEdit>>, clang::clangd::ClangdLSPServer>(llvm::StringLiteral, clang::clangd::ClangdLSPServer*, void (clang::clangd::ClangdLSPServer::*)(clang::clangd::DocumentRangeFormattingParams const&, llvm::unique_function<void (llvm::Expected<std::vector<clang::clangd::TextEdit, std::allocator<clang::clangd::TextEdit>>>)>))::'lambda'(llvm::json::Value, llvm::unique_function<void (llvm::Expected<llvm::json::Value>)>)>(void*, llvm::json::Value&, llvm::unique_function<void (llvm::Expected<llvm::json::Value>)>&) /src/llvm/include/llvm/ADT/FunctionExtras.h:222:12
    #10 0x8a3e190 in llvm::unique_function<void (llvm::json::Value, llvm::unique_function<void (llvm::Expected<llvm::json::Value>)>)>::operator()(llvm::json::Value, llvm::unique_function<void (llvm::Expected<llvm::json::Value>)>) /src/llvm/include/llvm/ADT/FunctionExtras.h:387:12
    #11 0x8a3e190 in clang::clangd::ClangdLSPServer::MessageHandler::onCall(llvm::StringRef, llvm::json::Value, llvm::json::Value) /src/clang-tools-extra/clangd/ClangdLSPServer.cpp:243:7
    #12 0x8d76b3c in clang::clangd::(anonymous namespace)::JSONTransport::handleMessage(llvm::json::Value, clang::clangd::Transport::MessageHandler&) /src/clang-tools-extra/clangd/JSONTransport.cpp:194:20
    #13 0x8d76b3c in clang::clangd::(anonymous namespace)::JSONTransport::loop(clang::clangd::Transport::MessageHandler&) /src/clang-tools-extra/clangd/JSONTransport.cpp:119:16
    #14 0x8a47cd9 in clang::clangd::ClangdLSPServer::run() /src/clang-tools-extra/clangd/ClangdLSPServer.cpp:1741:25
    #15 0x88915c9 in clang::clangd::clangdMain(int, char**) /src/clang-tools-extra/clangd/tool/ClangdMain.cpp:1049:28
    #16 0x7f4f29f5f5cf in __libc_start_call_main (/lib64/libc.so.6+0x295cf) (BuildId: 7a40a22c9a82854f3d66767232ae364a99174860)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions