[clang] d688b31 - Fix segfault in clang-format.

Manuel Klimek via cfe-commits cfe-commits at lists.llvm.org
Wed Dec 1 02:58:32 PST 2021


Author: Manuel Klimek
Date: 2021-12-01T11:57:41+01:00
New Revision: d688b31628004ed9e109e63c2b43701f97252ff3

URL: https://github.com/llvm/llvm-project/commit/d688b31628004ed9e109e63c2b43701f97252ff3
DIFF: https://github.com/llvm/llvm-project/commit/d688b31628004ed9e109e63c2b43701f97252ff3.diff

LOG: Fix segfault in clang-format.

Fix bug where we'd read past the end of the tokens after merging _T
macro strings.

Added: 
    

Modified: 
    clang/lib/Format/FormatTokenLexer.cpp
    clang/unittests/Format/FormatTest.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Format/FormatTokenLexer.cpp b/clang/lib/Format/FormatTokenLexer.cpp
index 972f59ead5d8f..64fbd2d5d45b1 100644
--- a/clang/lib/Format/FormatTokenLexer.cpp
+++ b/clang/lib/Format/FormatTokenLexer.cpp
@@ -752,6 +752,8 @@ bool FormatTokenLexer::tryMerge_TMacro() {
   Tokens.pop_back();
   Tokens.pop_back();
   Tokens.back() = String;
+  if (FirstInLineIndex >= Tokens.size())
+    FirstInLineIndex = Tokens.size() - 1;
   return true;
 }
 

diff  --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index 65809ab5e7579..9b6607b46d93a 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -12879,6 +12879,12 @@ TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
             format("f(\n"
                    "\n"
                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
+  // Regression test for accessing tokens past the end of a vector in the
+  // TokenLexer.
+  verifyNoCrash(R"(_T(
+"
+)
+)");
 }
 
 TEST_F(FormatTest, BreaksStringLiteralOperands) {


        


More information about the cfe-commits mailing list