llvm-project/clang/lib/Format
Richard Smith 1d2ae94b5d Fix mishandling of escaped newlines followed by newlines or nuls.
Previously, if an escaped newline was followed by a newline or a nul, we'd lex
the escaped newline as a bogus space character. This led to a bunch of
different broken corner cases:

For the pattern "\\\n\0#", we would then have a (horizontal) space whose
spelling ends in a newline, and would decide that the '#' is at the start of a
line, and incorrectly start preprocessing a directive in the middle of a
logical source line. If we were already in the middle of a directive, this
would result in our attempting to process multiple directives at the same time!
This resulted in crashes, asserts, and hangs on invalid input, as discovered by
fuzz-testing.

For the pattern "\\\n" at EOF (with an implicit following nul byte), we would
produce a bogus trailing space character with spelling "\\\n". This was mostly
harmless, but would lead to clang-format getting confused and misformatting in
rare cases. We now produce a trailing EOF token with spelling "\\\n",
consistent with our handling for other similar cases -- an escaped newline is
always part of the token containing the next character, if any.

For the pattern "\\\n\n", this was somewhat more benign, but would produce an
extraneous whitespace token to clients who care about preserving whitespace.
However, it turns out that our lexing for line comments was relying on this bug
due to an off-by-one error in its computation of the end of the comment, on the
slow path where the comment might contain escaped newlines.

llvm-svn: 300515
2017-04-17 23:44:51 +00:00
..
AffectedRangeManager.cpp Added Fixer implementation and fix() interface in clang-format for removing redundant code. 2016-04-25 15:09:22 +00:00
AffectedRangeManager.h removed redundant '#' 2016-04-28 07:52:06 +00:00
BreakableToken.cpp [clang-format] Handle NSString literals by merging tokens. 2017-04-11 09:55:00 +00:00
BreakableToken.h [clang-format] Reformat BreakableToken.h; NFC 2017-03-08 08:58:44 +00:00
CMakeLists.txt [clang-format] Add a NamespaceEndCommentsFixer 2017-02-27 13:28:36 +00:00
ContinuationIndenter.cpp [clang-format] Handle NSString literals by merging tokens. 2017-04-11 09:55:00 +00:00
ContinuationIndenter.h [clang-format] Refactor WhitespaceManager and friends 2017-01-31 11:25:01 +00:00
Encoding.h [Format] Remove dead code. 2016-12-19 21:10:50 +00:00
Format.cpp clang-format: Support formatting utf-8 character literals in C++11+ mode. 2017-04-05 18:10:42 +00:00
FormatToken.cpp clang-format: Fix bug in handling of single-column lists. 2016-12-21 17:02:06 +00:00
FormatToken.h clang-format: [JS] allow breaking after non-null assertions. 2017-03-13 09:14:23 +00:00
FormatTokenLexer.cpp Fix mishandling of escaped newlines followed by newlines or nuls. 2017-04-17 23:44:51 +00:00
FormatTokenLexer.h [clang-format] Handle NSString literals by merging tokens. 2017-04-11 09:55:00 +00:00
NamespaceEndCommentsFixer.cpp [clang-format] fix crash in NamespaceEndCommentsFixer (PR32438) 2017-04-04 20:11:13 +00:00
NamespaceEndCommentsFixer.h [clang-format] Add a NamespaceEndCommentsFixer 2017-02-27 13:28:36 +00:00
SortJavaScriptImports.cpp Use after move bug fixes 2016-12-23 11:40:44 +00:00
SortJavaScriptImports.h clang-format: [JS] sort ES6 imports. 2016-05-20 11:24:24 +00:00
TokenAnalyzer.cpp Don't copy replacements in for-range loop. NFC. 2016-10-19 13:50:17 +00:00
TokenAnalyzer.h [Format] Remove dead code. 2016-12-19 21:10:50 +00:00
TokenAnnotator.cpp [clang-format] Handle NSString literals by merging tokens. 2017-04-11 09:55:00 +00:00
TokenAnnotator.h [clang-format] Add a NamespaceEndCommentsFixer 2017-02-27 13:28:36 +00:00
UnwrappedLineFormatter.cpp [clang-format] Fix parameter name comment; NFC 2017-03-08 09:02:39 +00:00
UnwrappedLineFormatter.h [clang-format] Refactor WhitespaceManager and friends 2017-01-31 11:25:01 +00:00
UnwrappedLineParser.cpp clang-format: Fix post-commit review comment of r299204, use Style.isCpp(). 2017-03-31 13:30:24 +00:00
UnwrappedLineParser.h [clang-format] Add a NamespaceEndCommentsFixer 2017-02-27 13:28:36 +00:00
WhitespaceManager.cpp Fix issues in clang-format's AlignConsecutive modes. 2017-03-23 02:51:25 +00:00
WhitespaceManager.h Fix issues in clang-format's AlignConsecutive modes. 2017-03-23 02:51:25 +00:00