<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/64328>64328</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [clang-format] Segmentation fault trying to format very deeply nested brackets
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          scgtrp
      </td>
    </tr>
</table>

<pre>
    I wouldn't normally report this because it's kind of a "you're holding it wrong" bug, but the crash message explicitly asked me to :)

I have a script that generates C code in one mode, and a huge amount of of non-code debug output in another mode. I accidentally piped the latter to clang-format, and it crashed trying to parse this as C.

It appears that my script output a pair of `\e[...m` escape codes around every line, and `clang-format` sees the brackets in there, does its best to work with them, and spectacularly overflows its stack because it never sees a closing `]`.

Minimal example:
```
$ clang-format --version
clang-format version 15.0.7

$ perl -e 'print "[" x 50000;' |clang-format
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
(stack dump omitted, see below)
Segmentation fault (core dumped)
```

Backtrace with symbols (the one printed during the crash had only addresses):

```
(gdb) bt
#0 AlignTokens<clang::format::WhitespaceManager::alignChainedConditionals()::<lambda(const clang::format::WhitespaceManager::Change&)>&>(void) () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/WhitespaceManager.cpp:494
#1 0x00007f534ded7e81 in AlignTokens<clang::format::WhitespaceManager::alignChainedConditionals()::<lambda(const clang::format::WhitespaceManager::Change&)>&>(void) () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/WhitespaceManager.cpp:594
(37K duplicates of the previous line omitted)
#37321 0x00007f534ded7e81 in AlignTokens<clang::format::WhitespaceManager::alignChainedConditionals()::<lambda(const clang::format::WhitespaceManager::Change&)>&>(void) () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/WhitespaceManager.cpp:594
#37322 0x00007f534dee1c0f in clang::format::WhitespaceManager::alignChainedConditionals () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/WhitespaceManager.cpp:884
#37323 0x00007f534df12e25 in clang::format::WhitespaceManager::generateReplacements () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/WhitespaceManager.cpp:108
#37324 clang::format::WhitespaceManager::generateReplacements () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/WhitespaceManager.cpp:98
#37325 0x00007f534debd867 in analyze () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/Format.cpp:2052
#37326 0x00007f534deca4f1 in clang::format::TokenAnalyzer::process () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/TokenAnalyzer.cpp:128
#37327 0x00007f534e018488 in clang::format::internal::reformat(clang::format::FormatStyle const&, llvm::StringRef, llvm::ArrayRef<clang::tooling::Range>, unsigned int, unsigned int, unsigned int, llvm::StringRef, clang::format::FormattingAttemptStatus*)::{lambda(clang::format::Environment const&)#8}::operator()(clang::format::Environment const&) const [clone .isra.0] () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/Format.cpp:3307
#37328 0x00007f534de61b6b in __invoke_impl<std::pair<clang::tooling::Replacements, unsigned int>, clang::format::internal::reformat(const clang::format::FormatStyle&, llvm::StringRef, llvm::ArrayRef<clang::tooling::Range>, unsigned int, unsigned int, unsigned int, llvm::StringRef, clang::format::FormattingAttemptStatus*)::<lambda(const clang::format::Environment&)>&, const clang::format::Environment&> () at /usr/include/c++/13.1.1/bits/invoke.h:61
#37329 __invoke_r<std::pair<clang::tooling::Replacements, unsigned int>, clang::format::internal::reformat(const clang::format::FormatStyle&, llvm::StringRef, llvm::ArrayRef<clang::tooling::Range>, unsigned int, unsigned int, unsigned int, llvm::StringRef, clang::format::FormattingAttemptStatus*)::<lambda(const clang::format::Environment&)>&, const clang::format::Environment&> () at /usr/include/c++/13.1.1/bits/invoke.h:139
#37330 _M_invoke () at /usr/include/c++/13.1.1/bits/std_function.h:291
#37331 0x00007f534decb937 in std::function<std::pair<clang::tooling::Replacements, unsigned int> (clang::format::Environment const&)>::operator()(clang::format::Environment const&) const () at /usr/include/c++/13.1.1/bits/std_function.h:591
#37332 clang::format::internal::reformat () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/Format.cpp:3325
#37333 0x00007f534deced50 in clang::format::reformat () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/Format.cpp:3351
#37334 0x000055a569b24e88 in format () at /usr/src/debug/clang/clang-15.0.7.src/tools/clang-format/ClangFormat.cpp:497
#37335 0x000055a569b1d448 in main () at /usr/src/debug/clang/clang-15.0.7.src/tools/clang-format/ClangFormat.cpp:614
```

I can also reproduce this with `(`, with a different stack trace:

```
(gdb) bt
#0  0x00007f420aaf2e0c in consumeToken () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/TokenAnnotator.cpp:914
#1 0x00007f420aaf5fd2 in parseParens () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/TokenAnnotator.cpp:474
#2 0x00007f420aaf2f35 in consumeToken () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/TokenAnnotator.cpp:1079
#3 0x00007f420aaf5fd2 in parseParens () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/TokenAnnotator.cpp:474
...
#52244 0x00007f420aaf2f35 in consumeToken () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/TokenAnnotator.cpp:1079
#52245 0x00007f420aaf5fd2 in parseParens () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/TokenAnnotator.cpp:474
#52246 0x00007f420aaf2f35 in consumeToken () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/TokenAnnotator.cpp:1079
#52247 0x00007f420aaf6d88 in parseLine () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/TokenAnnotator.cpp:1461
#52248 0x00007f420aaf7887 in clang::format::TokenAnnotator::annotate () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/TokenAnnotator.cpp:2683
#52249 0x00007f420aaca4be in clang::format::TokenAnalyzer::process () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/TokenAnalyzer.cpp:124
#52250 0x00007f420aacff5c in clang::format::guessLanguage () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/Format.cpp:3500
#52251 0x00007f420aad0209 in clang::format::getStyle () at /usr/src/debug/clang/clang-15.0.7.src/lib/Format/Format.cpp:3531
#52252 0x000055a15070d640 in format () at /usr/src/debug/clang/clang-15.0.7.src/tools/clang-format/ClangFormat.cpp:442
#52253 0x000055a150706448 in main () at /usr/src/debug/clang/clang-15.0.7.src/tools/clang-format/ClangFormat.cpp:614
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWltP5DgW_jXm5YjIca71wAMUlNTaaWnUrLSPLSc-SXlx7Mh2oGt__cpOXQjDMEMLELtqqRRy8eU73_mOfWzDnZO9RrwgxRUprs_45LfGXri293Y8a4zYXXyBBzMpoQmrPGhjB67UDiyOxnrwW-mgwZZPDkF6wioHd1ILMB1wIIztzERYZRG2Rgmpe5AeHqzRPWEMmqknbA3NFBpCaC13WxjQOd4j4I9RyVZ6tQPu7lDAgOANkOySsBWh14ReztcvsOX3CBxca-UYmuIeetRouUcHa2iNQJAajEYYjMDQJ9cCOGynHoEPZtI-IDYdaKPPY3mBzdSDmfw4-VCZa-O3aGMDCXwB3rZSoPaRjVGOKKINinuPNgBtFdf9eRcI84cepZ-NDIXtLtDhDYzcOpyZ5A7WycI2D3wckVs3mzXsDlbukXEYubQBOSkpKdZIiqskSQZSUkDX8hGj-Q64NZMWgPdod6CkPrJASrqAWlJwiC5a01je3qF3gYBgfawkDDqQPvjd-WDAg7F38CD9NpQZDu26EVvP20lxq3Zg7tF2yjzMNZ3n7d0j3YAOuOZ-ObTKuMBNtOialHRByVep5cAV4A8-jAqDHuavJd3_5keWL1wA5-f3aJ00ev6--Lb_AmmR0KR63FtoZkSr4ByBsGq0Uvug6xAvjMEPKCillGRXhFVAqvWCytjC77_dXN7egJuaQQZ_BVkdosfA1vvRRU1vCNv00m-nJmnNQNhGqfvDn_PRmn9j6wnbSOcmdIRtZkHpVk0CH4VPw9s7b3mLe9JuI9ViGsYTU6x2x7dgBuk9iuA2hwgNKvNwjLBb7Icgch_Y6fikgvF1ayzGyqHa6nn64_XqAGaWh9sNjVEuNBEAh3iMhKIAMdkYDkc7tlyA0SH4hbDoXLB5dTLheZfXvWgIW0HjD28yCpdK9vqf5g61I9nsoNBOdrn3Urz_11Z6dCNv8SvXvEc7v-ah7nrLpUaxNlrIQARXjrB6Dyf81ooPjeCRGe08vK6P9ZbrHgkrY4s34SZc63sjA70w9wU8UL-ZnCVs42xL2CYOUYRt5u72f89nDSdzESUbwjab_SC0-QOCpB2DLvJVfiQsBfojaLrqiiwXKCqs0xD_v2j8SxqLE411Vv0DxBSmsDgLmS5qe7R4L83k4gh8Cr3Vkf2sytgvD7yFByKVbEklpi3tApVvQ95HWFTXS4uyhUVdypAVr7fokB59w1HxFsMY_yHWpLReWJP_j-BeLWEXS1k1oi6rOUnkavcffEtE880eBqMFWwApl0BannfpC2qIg8flDHLP6GhNi-5NSVz0cnA8WzJYPQaONK3zun4BeEgSrOZqfrJ4SKvrPyk_Y7n1OxXyX-18HJXWEHOqWOLWh4TjG3bL15fW8l14uxhgvTFKHh6-xVEujGxrmHRcP4VEzP-d5z_p_0UrvNT9pfc4jP7Wcz85wi5PY3Z1dRqzn2_lRt9La3SIlUdcrAjLalJdz2XMGMLK2P108Nq25nsgxVWrQlaXSGd5ErL3dwuFLKPVQlH1MhTKtCmboKjv36W-N3f4XQ6jItnaebFXPpf2JTc_GmL-4MrZ-68W60uT6iPJ_t-K9e8mGI9ktkgnQu-vqJfdPCe__ZopSI6wq_jbpFmSJilhm0YGb29mySRbkl2W6UJmq5Og7C81_VLTK9WUZotcP6Pw_eteTz_buvPiezfpNiSlsQ-2Wkj26YqubVZZzFaO2j3Ufjs9w-uno-zmTaeiN-KyeMIle12YvuP0x4oFsOyJk1EU9IWE6gMAFkvm8j3AouBFuWpYjnPG9wY4gjLd8dNhgNysw-MCVL5a5AxZscSUijyPmAYu9ccgKtP8hf2zL9ByDVw5AxZHa8TU7neK435aKM3qeF3PbzgI2XVoQ1DMe3xx--2n9s2OgsoZ5bxjSNsoKKPdNGBM8t9h1aCND9F_WHelz21MzYCKTrAAKO6f_84t6vdYxSzx5NUJD3tKUJcVH05QSqtHE8pnYihJkiOwgrE8_3R0BVTFZ6Jsj6n8lExVT1CVYh6_I1O_Sf2mux7PQ8of5eIBUv0EUlXX1V_vfuwb3W_tzY_vD56VdbYAv1qCb3ne4CfdulnIs6BPgHdd0b4AvJ_Qud-47ifev9_OWFZQukD5ZLYQlNHVSyhxv1v0fgCzhXgLdso90oJWVJQ5_fB8KGcLTNkTTOUnyIfOxEUmVtmKn-FFWq7oKq_zmp5tLzohMlbwdsU6zLuyZWUuyryqO2Qced6eyQtGWUZrymhW5DlN0i4vaVdmWHddii2SnOLApUrC2jQxtj-Lp6sXZZ6x-kzxBpW7mE96NT5A_BjPfq_P7EU8l22m3pGcKum8O7XipVfxXyoW5hbX8Mxx6un_AE5n0TsQiKPagUbnURyP4c8mqy5-_sQ4mvXfAAAA__8Hp20q">